mysql - 过去 7 天的返回计数,已填写缺失日期

标签 mysql sql

我非常努力地生成过去 7 天内每一天的总销售额数据集,并填补缺失的天数。

对于我的示例数据,我正在寻找的结果是:

2019-01-05  0
2019-01-06  0
2019-01-07  0
2019-01-08  0
2019-01-09  0
2019-01-10  1
2019-01-11  0

我得到的是:

2019-01-05  0
2019-01-06  0
2019-01-07  0
2019-01-08  0
2019-01-09  0
2019-01-10  0
2019-01-11  0

示例数据,尽管为 SO 缩短了,看起来像这样,只有一行:

id | saleID            | amount      | created
---|-------------------|-------------|-------------
1  | 6032b317-1533.... | 20000       | 2019-01-10 23:56:4

ID = INT 11 Auto
saleID = CHAR 36 INDEX
amount = INT 11 INDEX
created = DATETIME INDEX

我的查询现在看起来像这样:

SELECT
    qb.dy AS saleDay,
    COALESCE(COUNT(ets.saleID), 0) AS saleDayTotal
FROM eventTicketSales AS ets 
RIGHT JOIN (
    SELECT curdate() AS dy UNION
    SELECT DATE_SUB(curdate(), INTERVAL 1 DAY) AS dy UNION
    SELECT DATE_SUB(curdate(), INTERVAL 2 DAY) AS dy UNION
    SELECT DATE_SUB(curdate(), INTERVAL 3 DAY) AS dy UNION
    SELECT DATE_SUB(curdate(), INTERVAL 4 DAY) AS dy UNION
    SELECT DATE_SUB(curdate(), INTERVAL 5 DAY) AS dy UNION
    SELECT DATE_SUB(curdate(), INTERVAL 6 DAY) AS dy        
) AS qb ON ets.created = qb.dy AND ets.created > DATE_SUB(curdate(), INTERVAL 7 DAY)
GROUP BY qb.dy
ORDER BY qb.dy ASC;

您可以 play with a fiddle here .

请告诉我我做错了什么,并建议如何解决。

谢谢。

最佳答案

... AS qb ON ets.created = qb.dy

您正在将日期时间与没有时间的日期进行比较。这不匹配,因为时间显然不相同。

要解决这个问题,您可以在比较之前将日期时间转换为日期,使用 DATE 函数:

... AS qb ON DATE(ets.created) = qb.dy

关于mysql - 过去 7 天的返回计数,已填写缺失日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54149699/

相关文章:

php - 如果出现任何通知,如何限制 MySQL/PHP 插入数据?

mysql - 当使用 MySQL 定义的隐藏 ROW_ID 列作为 PK 时,哪些版本的 MySQL 会受到可伸缩性问题的影响?

sql - 如何从一列中获取不同的数据

sql - BULK INSERT 0 受影响的行

MySQL:将元素添加到结果数组

mysql - Sql - 写一些东西而不是NULL值

php - 使用 select mysql 删除

sql - 如何使用 SQL Server 找到最接近零的值

mysql - 在 MySQL 中组合复合外键?

c# - DayPilot SQL - 复制没有日期的约会