我有一个用户数据点表,我正在尝试使用group by,min和case来转移它。
所以..
的user_data:
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
这种'排序'是有效的,除非通常值为NULL,即使*是数据集中的那些数据类型的值,如果我删除组和最大值
我正在努力了解幕后发生的事情,因为它非常令人困惑。 group by
看起来每个用户只有一行(我不确定它是如何决定哪一行......可能是第一行?)但是不知怎的,case语句设法找到了不属于行的信息没有显示出来。
我真的很感激帮助理解这里发生的事情,以便我能够获得我实际寻求的数据。
答案 0 :(得分:1)
您要做的是将行( 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 ║
╚═════════╩═══════════╩══════════╝
请注意,如果(null)
语句中的条件不符合,则值为CASE
。
为了将user_id
分类为每个组的行并消除这些null
值,聚合函数MAX()
应用于行:firstname
和{{1 }}。
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
答案 1 :(得分:0)
select
max( case when data_type_id = 1 then value else '' end) as 'firstName',
max( case when data_type_id = 2 then value else '' end) as 'lastName'
from user_data group by user_id
可能会得到你想要的东西