我有一个用户数据点表,我正在尝试使用分组依据、最小值和个案来调整它。
所以..
用户数据:
user_id | data_type_id | value
1 | 1 | 'Joe'
1 | 2 | 'Blow'
2 | 1 | 'Mary'
2 | 2 | 'Jones'
select
max( case when data_type_id = 1 then value end) as 'firstName',
max( case when data_type_id = 2 then value end) as 'lastName'
from user_data group by user_id
这种'a sort'a 有效,除了通常值是 NULL,即使如果我删除分组依据和最大值,数据集中*存在这些数据类型的值。
我试图了解幕后发生的事情,因为它非常令人困惑。 group by
看起来每个用户只有一行(我不确定它是如何决定哪一行的……可能是第一行?)但是 case 语句以某种方式设法找到了信息对于未显示的行。
如果能帮助我理解这里发生的事情,我将非常感激,这样我就可以获得我实际正在寻找的数据。
最佳答案
您要做的是将行 (data_type_id) 转置为列。当你执行下面的语句时,
SELECT user_id,
CASE WHEN data_type_id = 1 THEN value END firstName,
CASE WHEN data_type_id = 2 THEN value END lastName
FROM TableName
它会给你下面的结果,
╔═════════╦═══════════╦══════════╗
║ USER_ID ║ FIRSTNAME ║ LASTNAME ║
╠═════════╬═══════════╬══════════╣
║ 1 ║ Joe ║ (null) ║
║ 1 ║ (null) ║ Blow ║
║ 2 ║ Mary ║ (null) ║
║ 2 ║ (null) ║ Jones ║
╚═════════╩═══════════╩══════════╝
请注意,当它不满足 CASE
语句中的条件时,该值为 (null)
。
为了将 user_id
归类到每一组的一行中并消除那些 null
值,聚合函数 MAX()
应用于行:firstname
和 lastname
。
SELECT user_id,
MAX(CASE WHEN data_type_id = 1 THEN value END) firstName,
MAX(CASE WHEN data_type_id = 2 THEN value END) lastName
FROM TableName
GROUP BY user_id
因此给你以下结果,
╔═════════╦═══════════╦══════════╗
║ USER_ID ║ FIRSTNAME ║ LASTNAME ║
╠═════════╬═══════════╬══════════╣
║ 1 ║ Joe ║ Blow ║
║ 2 ║ Mary ║ Jones ║
╚═════════╩═══════════╩══════════╝
关于mysql - 希望通过结合最大(或最小)对组进行一些澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19340853/