У меня проблема с моим кодом SQL,
Вот код:
SELECT
COUNT(CASE WHEN ItemState = 1 THEN 1 ELSE NULL END) AS C1,
COUNT(CASE WHEN ItemState = 3 THEN 1 ELSE NULL END) AS C2,
COUNT(CASE WHEN ItemState = 5 THEN 1 ELSE NULL END) AS C3,
COUNT(CASE WHEN ItemState = 7 THEN 1 ELSE NULL END) AS C4,
COUNT(CASE WHEN ItemState = 10 THEN 1 ELSE NULL END) AS C5,
DAY(LastUpdate) AS Day
FROM purchasehistory
WHERE ItemID=77
AND LastUpdate BETWEEN "2017-10-25 00:00:00" AND "2017-10-30 23:59:59"GROUP BY Day
ORDER BY LastUpdate
LIMIT 5
Оператор подсчета — это работа, но результат не тот, который я хотел
Он должен показывать пять записей, где день равен 25, 26, 27, 28, 29, 30
Но когда c1, c2, c3, c4 и c5 равны 0, строка не показывает вместо 0
Как решить проблему?
Я считаю, что во многих случаях простой способ исправить это — перенести некоторые условия фильтра в case
условия:
SELECT SUM(ItemID = 77 AND ItemState = 1) AS C1,
SUM(ItemID = 77 AND ItemState = 3) AS C2,
SUM(ItemID = 77 AND ItemState = 5) AS C3,
SUM(ItemID = 77 AND ItemState = 7) AS C4,
SUM(ItemID = 77 AND ItemState = 10) AS C5,
DAY(LastUpdate) AS Day
FROM purchasehistory
WHERE LastUpdate >= '2017-10-25' AND LastUpdate < '2017-10-31'
GROUP BY Day
ORDER BY MIN(LastUpdate)
LIMIT 5;
Это предполагает, что в каждый день есть как минимум один продукт.
Более типичным решением является использование LEFT JOIN
— и это может быть лучше с точки зрения производительности. Я просто считаю, что вышеуказанный подход является более быстрым способом получения желаемых результатов.
Некоторые другие заметки:
CASE
,LIMIT 5
если вы выбираете данные за шесть дней?Других решений пока нет …