假设我有桌子
NAME | ID | REF
foo1 | 1 | NULL
foo2 | 2 | 1234
foo2 | 3 | 567
foo1 | 4 | NULL
foo3 | 5 | 89
我想在一个查询中计算所有NULL和NOT NULL的实例,以便我可以说
NAME | null | not null
foo1 | 0 | 2
foo2 | 2 | 0
foo3 | 0 | 1
我可以运行这两个查询
select NAME,count(*) from TABLE where REF is not null
select NAME,count(*) from TABLE where REF is null
但我确信在一个mysql查询中必须有一个简单的方法。
答案 0 :(得分:10)
您可以像这样在ISNULL()上使用SUM()
select NAME, sum(isnull(REF)) as is_null, sum(not isnull(REF)) as is_not_null from TABLE group by NAME;
SUM(1)相当于COUNT(*),因此它将真正计算。
答案 1 :(得分:1)
如果使用分组的解决方案没问题,您可以尝试以下方法:
SELECT ISNULL(ref),COUNT(*) FROM TABLE GROUP BY ISNULL(ref)
至少它告诉你你在ref中有多少行为NULL。 如果您需要选择每个单独的名称,可以通过在NAME上选择GROUP_CONCAT来扩展此解决方案(好与否)。
答案 2 :(得分:0)
我认为MySQL有一个IF()函数,所以你可以写:
SELECT Name, SUM(IF(ISNULL(Ref), 1, 0)) AS NullCount,
SUM(IF(ISNULL(Ref), 0, 1)) AS NotNullCount
FROM Table GROUP BY Name
因此,您使用IF()函数为每行生成零或一,并将它们相加以获得“一”的总数。