【问题标题】:Different Counts in a single query单个查询中的不同计数
【发布时间】:2019-02-14 22:59:45
【问题描述】:

我有一张这样的桌子:

---------------------- |姓名 |日期 | ---------------------- |约翰 |七月 | |卡尔 |八月 | |约翰 |七月 | |罗伯特 |八月 | |卡尔 |九月 | |约翰 |八月 | |卡尔 |八月 | |约翰 |七月 | |罗伯特 |九月 | |卡尔 |八月 | ----------------------

我想按月份计算姓名。

选择名称, COUNT(IF(`Date` = 'July',1,0)) AS 七月, COUNT(IF(`Date` = 'August',1,0)) AS 八月, COUNT(IF(`Date` = 'September',1,0)) AS 9 月, COUNT(*) AS All FROM 表 按名称分组

我试过这个查询,但是计数值都一样

【问题讨论】:

标签: mysql sql null aggregate-functions


【解决方案1】:

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

【讨论】:

【解决方案2】:
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或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
    

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

        【解决方案5】:

        count 计算不是null 的值 - 包括零。使用ifs,您可以使用sum 来模拟count - 您将有效地计算1s 的值:

        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
        

        【讨论】:

        • @Horez SUM(IF(Date = 'July',1,0)) 也可以改写为 SUM(Date = 'July') 没关系。注意日期周围的反引号
        【解决方案6】:
        select date, count(*) 
        from table1
        group by date
        

        应该给你类似的东西

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

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

        【讨论】:

        • 这不是预期的结果。他想得到姓名和日期计数。请参阅下面的答案。
        • 你可能是对的。从最初的问题来看,预期的结果并不那么清楚。无论如何,感谢您指出这一点。我尝试了你的答案,并在上面评论了 SQLFiddle。
        • @EliasSoares 其实 OP 说I would like to count the names divided by month. 我也理解这样,
        【解决方案7】:

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

        【讨论】:

        • 如果您看到 OP 尝试,他希望每个用户都有一行
        • @JuanCarlosOropeza 确实如此,但他这样做的方式非常低效,也许他可以使用这个答案。
        猜你喜欢
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多