MySQL:如何添加额外的行来计算NULL和NON NULL值的数量



我有一个表,我已经将其转置(列到行(如下:

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。

最新更新