Причина, по которой это происходит, проста: COUNT()
просто считает вхождения значений .(= сколько значений содержится в наборе данных?)
Если посмотреть таким образом, 0
- это просто другое значение, подобное 1
.
Вы можете сделать либо:
SELECT Name,
COUNT(IF(`Date` = 'July', 1, NULL)) AS July,
COUNT(IF(`Date` = 'August', 1, NULL)) AS August,
COUNT(IF(`Date` = 'September', 1, NULL)) AS September,
COUNT(*) AS All FROM table
GROUP BY Name
Это работает, потому что агрегатные функции, такие как COUNT()
игнорируют NULL
значения.
Или, как ответили другие, вы можете просто SUM()
все значения 1
:
SELECT Name,
SUM(`Date` = 'July') AS July,
SUM(`Date` = 'August') AS August,
SUM(`Date` = 'September') AS September,
COUNT(*) AS All FROM table
GROUP BY Name
Это написано короче, потому что оценка field = value
уже возвращает 1
, если совпадает, или 0 в противном случае.Не нужно оборачивать IF()
вокруг, чтобы делать то же самое.