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或删除DISTINCT和ELSE 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.