web-dev-qa-db-ja.com

カウントおよびgroupbyでCASEを使用するSQL

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と数えられますか?ありがたいポインタ

6
Katia

あなたの問題は、COUNTNULLではないすべての結果をカウントすることです。あなたの場合、あなたは以下を使用しています:

COUNT(distinct case when name = 'sweets' then 1 else 0 end)

したがって、名前がsweetsでない場合は、0をカウントします。さらに、DISTINCTを使用しているため、1つまたは2つの値のみがカウントされます。 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

または:

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があります。

13
Lamak

エイリアスでグループ化することはできません。式でグループ化する必要があります。

group by date(date)
2
Dan Bracuk