SQL在count和group中使用CASE

Kat*_*tia 6 mysql sql aggregate-functions

我正在使用CASE表中的数据进行分类并对它们进行计数,但结果并不准确

现场演示[这里]

select DATE(date) as day, count(*),
count(distinct case when name = 'fruit' then 1 else 0 end) as fruits,
count(distinct case when name = 'vege' then 1 else 0 end) as vege,
count(distinct case when name = 'sweets' then 1 else 0 end) as sweets
from food
group by day
with rollup
Run Code Online (Sandbox Code Playgroud)

我不确定问题是CASE在字符串匹配中还是在字符串匹配中,=因为没有'甜点'仍然是1?任何指示我都会感激不尽

Lam*_*mak 13

你的问题是COUNT计算每个不是的结果NULL.在您的情况下,您正在使用:

COUNT(distinct case when name = 'sweets' then 1 else 0 end)
Run Code Online (Sandbox Code Playgroud)

因此,当名称不是时sweets,它会计算0.此外,由于您使用DISTINCT,它只计算一个或两个值.你应该使用SUM或删除DISTINCTELSE 0:

SELECT  DATE(date) as day, 
        COUNT(*),
        SUM(CASE WHEN name = 'fruit' THEN 1 ELSE 0 END) as fruits,
        SUM(CASE WHEN name = 'vege' THEN 1 ELSE 0 END) as vege,
        SUM(CASE WHEN name = 'sweets' THEN 1 ELSE 0 END) as sweets
FROM food
GROUP BY DAY
WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)

要么:

SELECT  DATE(date) as day, 
        COUNT(*),
        COUNT(CASE WHEN name = 'fruit' THEN 1 ELSE NULL END) as fruits,
        COUNT(CASE WHEN name = 'vege' THEN 1 ELSE NULL END) as vege,
        COUNT(CASE WHEN name = 'sweets' THEN 1 ELSE NULL END) as sweets
FROM food
GROUP BY DAY
WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)

这是一个修改过的sqlfiddle.