1

我有一个用户数据点表,并尝试使用 group by、a min 和 case 对其进行透视。

所以..

用户数据:

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和max,数据集中这些数据类型的值也是如此。

我试图了解这里幕后发生的事情,因为它非常令人困惑。group by使它看起来每个用户只有一行(我不确定它如何决定哪一行......可能是第一行?)但随后 case 语句设法找到未显示的行的信息。

在理解这里发生的事情时,我真的很感激一些帮助,以便我可以获得我实际正在寻找的数据。

4

2 回答 2

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()应用于行:firstnamelastname

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    ║
╚═════════╩═══════════╩══════════╝
于 2013-10-13T01:39:48.540 回答
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

可能会得到你想要的

于 2013-10-13T01:25:43.930 回答