单个查询中的不同计数

时间:2018-09-10 13:33:57

标签: mysql sql null aggregate-functions

我有一张这样的桌子:

-----------------------
|  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 :(得分:2)

发生这种情况的原因很简单: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()即可完全相同。

答案 1 :(得分:1)

您可以尝试的最简单方法。 条件集合函数带有布尔值(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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试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

答案 5 :(得分:0)

count计算非null的值-包括零。使用这些if,您可以使用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

答案 6 :(得分:0)

select date, count(*) 
from table1
group by date

应该给您类似

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

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