我有一个表,我已经将其转置(列到行(如下:
ID Year Type Data
109 2018 A NULL
105 2019 B 1001
109 2018 A NULL
105 2019 B NULL
109 2018 A 1002
105 2019 A 1001
109 2019 A 1002
105 2018 B NULL
105 2019 B NULL
109 2019 A 1002
如何将上表转换为以下内容:
ID Year Type Null_Populated Record_Count
109 2018 A NULL 1
109 2018 A Populated 1
105 2018 A NULL 0
105 2018 A Populated 0
109 2018 B NULL 0
109 2018 B Populated 0
105 2018 B NULL 1
105 2018 B Populated 0
109 2019 A NULL 0
109 2019 A Populated 2
105 2019 A NULL 0
105 2019 A Populated 1
109 2019 B NULL 0
109 2019 B Populated 0
105 2019 B NULL 2
105 2019 B Populated 1
以下是我用来将列转换为行的查询:
select c.ID,
t.Year,
t.Type,
case c.ID
when '109' then 109
when '105' then 105
end as data
from t2 t
cross join
(
select '109' as 109
union all select '105'
) c
有没有一种方法可以通过添加到上面的查询中来获得我想要的内容?
首先,这是一种混乱的方法——假设我理解您的"我想要什么";数据集正确:
SELECT ID, YEAR, TYPE, 'Populated' as `Null_Populated`, COUNT(*) as Record_Count FROM t2 WHERE Data IS NOT NULL GROUP BY ID, YEAR, TYPE
UNION ALL
SELECT ID, YEAR, TYPE, 'Null' as `Null_Populated`, COUNT(*) as Record_Count FROM t2 WHERE Data IS NULL GROUP BY ID, YEAR, TYPE
如果索引设置正确,那么在DB上也应该容易得多。你的问题并不是很清楚你的目标是什么,因为你写的查询没有多大意义,尤其是基于你发布的预期数据。
上面适用于你尝试做的事情(它不会返回count(*(=0条记录是唯一的区别(,但我真的不确定你想做什么,所以我不知道这对你的用例是否重要。它还适用于2个以上的ID,如果查询开始扩展,则不会使用这些ID。