Разное количество в одном запросе - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть такая таблица:

-----------------------
|  Name   | Date      |
-----------------------
| John    | July      |
| Carl    | August    |
| John    | July      |
| Robert  | August    |
| Carl    | September |
| John    | August    |
| Carl    | August    |
| John    | July      |
| Robert  | September |
| Carl    | August    |
----------------------- 

Я бы хотел посчитать имена, разделенные на месяц.

SELECT Name, 
COUNT(IF(`Date` = 'July',1,0)) AS July,
COUNT(IF(`Date` = 'August',1,0)) AS August,
COUNT(IF(`Date` = 'September',1,0)) AS September,
COUNT(*) AS All FROM table
GROUP BY Name

Я пробовал этот запрос, но все значения счетчиков одинаковы

Ответы [ 7 ]

0 голосов
/ 10 сентября 2018
SELECT name,
  SUM(IF(`month` = 'July',1,0)) AS July,
  SUM(IF(`month` = 'August',1,0)) AS August,
  SUM(IF(`month` = 'September',1,0)) AS September,
  COUNT(*)  FROM test
GROUP BY name;

Ссылка: https://stackoverflow.com/a/13075582/1688441

0 голосов
/ 10 сентября 2018

Причина, по которой это происходит, проста: 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() вокруг, чтобы делать то же самое.

0 голосов
/ 10 сентября 2018

Самый простой способ, которым вы можете попробовать это. условие агрегатная функция с bool (0 или 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
0 голосов
/ 10 сентября 2018
select date, count(*) 
from table1
group by date

Должно дать вам что-то вроде

|DATE       |Count(*)|
----------------------
|August     |    5   |
|July       |    3   |
|September  |    2   |

http://sqlfiddle.com/#!9/c0a483/2

0 голосов
/ 10 сентября 2018

count считает значения, которые не null - включая нули.С этими if s вы можете использовать sum для эмуляции count - вы будете эффективно считать значения, которые 1 s:

SELECT Name, 
SUM(IF(`Date` = 'July',1,0)) AS July,
SUM(IF(`Date` = 'August',1,0)) AS August,
SUM(IF(`Date` = 'September',1,0)) AS September,
SUM(*) AS All FROM table
GROUP BY Name
0 голосов
/ 10 сентября 2018

Попробуйте SELECT Name, Date, Count(*) as Count FROM table GROUP BY Name,Date

Должно возвращаться что-то вроде этого:

| Name  | Date      | Count |
-----------------------------
| Carl  | August    |   3   |
| Carl  | September |   1   |
| John  | July      |   3   |
| John  | August    |   1   |
| Robert| September |   1   |
| Rober | August    |   1   |

Смотрите это SQL Fiddle .

0 голосов
/ 10 сентября 2018

COUNT считает ненулевые значения, попробуйте SUM

SELECT Name, 
SUM(IF(`Date` = 'July',1,0)) AS July,
SUM(IF(`Date` = 'August',1,0)) AS August,
SUM(IF(`Date` = 'September',1,0)) AS September,
COUNT(*) AS All FROM table
GROUP BY Name
...