计数中值为零的 MySQL GROUP BY

标签 mysql sql

<分区>

我有以下查询,我需要计算与同一天具有相同 golddate 的用户数量,但是由于我必须使用 GROUP BY,所以当那天没有人时它不会返回零值, 你能帮忙吗?

SELECT count( * ) AS total, DATE( `golddate` ) AS gold_date
                FROM `user`
                WHERE YEAR( `golddate` ) >=2014
                GROUP BY DATE( `golddate` )
                ORDER BY DATE( `golddate` ) ASC 

我想展示类似的东西

goldate | total

2012-12-10 | 23
2012-10-12 | 0

但问题是它永远不会返回零值日期,因为分组依据

我试过跟随但没有用,

SELECT
  u1.golddate
  -- this will count the number of links to each word
  -- if there are no links the COUNT() call will return 0
  , COUNT(u2.golddate) AS linkCount
FROM user u2
  LEFT JOIN user u1
    ON u1.user_id = u2.user_id
      OR u2.user_id = u1.user_id
GROUP BY u1.golddate

即使这样也行不通

SELECT COALESCE(COUNT(`golddate`), 0) AS total, DATE( `golddate` ) AS gold_count
                FROM `user`
                WHERE YEAR( `golddate` ) >=2014
                GROUP BY DATE( `golddate` )
                ORDER BY DATE( `golddate` ) ASC  

最佳答案

正如其他人所提到的,您需要为缺失数据人为创建日期。

使用 RedFilter's cross join date generation code here ,下面介绍了如何创建给定范围内的所有日期,然后 LEFT JOIN 返回到您的真实数据。 COUNT(*) 需要更改为 user 表中的内容,以便不计算虚拟日期。

SELECT count(u.golddate) AS total, a.Date AS golddate
FROM 
(
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a  

LEFT OUTER JOIN `user` u
  ON DATE(u.golddate) = a.Date

WHERE a.Date between '2013-01-01' and '2013-01-10'

GROUP BY a.Date
ORDER BY a.Date ASC;

SqlFiddle here

关于计数中值为零的 MySQL GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362578/

相关文章:

mysql - 获取MySQL中给定类别的子类别下的项目数

SQL 选择最后一次出现的唯一属性

mysql - 如何使用预定项目列表保存用户的自定义输入

mysql - 为什么 ENUM 不在 MySQL 中存储多个值?

sql - groupby 和 count 如何在 sql 中工作

c# - 如何使用 EF DB First 将 SQL DB 迁移到 Azure SQL DB

sql - 使用 Big Query 从每个组中选择第一行并按计数

mysql - 选择开始日期和此开始日期后的特定天数之间的记录

php - 在 Doctrine 查询构建器中调用自定义 MySql 函数 查询

MySql 异常未处理 - 命令执行期间遇到 fatal error