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
問題がCASE
にあるのか、=
に一致する文字列にあるのかわかりません。「お菓子」がないので、まだ1と数えられますか?ありがたいポインタ
あなたの問題は、COUNT
がNULL
ではないすべての結果をカウントすることです。あなたの場合、あなたは以下を使用しています:
COUNT(distinct case when name = 'sweets' then 1 else 0 end)
したがって、名前がsweets
でない場合は、0
をカウントします。さらに、DISTINCT
を使用しているため、1つまたは2つの値のみがカウントされます。 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
または:
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
ここに 変更されたsqlfiddleがあります。
エイリアスでグループ化することはできません。式でグループ化する必要があります。
group by date(date)