mysql - 使用mysql间隔按月分组获取数据

标签 mysql

我想从我的采购表中按月分组过去 1 年的记录。值得一提的是,过去两个月(包括当前)没有购买。 mysql查询如下

SELECT Year(purchasedate) as y ,Month(purchasedate) as m, Count(*) FROM purchase WHERE productid=1001 AND purchasedate >= CURDATE() - INTERVAL 1 YEAR GROUP BY m, y

它返回自上次购买日期起 11 个月的数据

2015 1 9177
2015 2 9914
2015 3 11672
2015 4 10521
2015 5 11873
2015 6 10449
2015 7 4057
2014 9 340
2014 10 9913
2014 11 8451
2014 12 7857

但它应该返回 12 个月的数据。

    2015 1 9177
    2015 2 9914
    2015 3 11672
    2015 4 10521
    2015 5 11873
    2015 6 10449
    2015 7 4057
    2015 8 0
    2015 9 0
    2014 10 9913
    2014 11 8451
    2014 12 7857

我做错了什么。提前致谢。

最佳答案

试试这个

SELECT d.y, d.m, p.cnt 
FROM 
    (SELECT a.y, b.m 
    FROM (SELECT 2015 AS Y UNION ALL SELECT 2014 AS Y) a
    CROSS JOIN (SELECT 1 AS m UNION ALL SELECT 2 AS m UNION ALL SELECT 3 AS m UNION ALL SELECT 4 AS m UNION ALL SELECT 5 AS m UNION ALL SELECT 6 AS m UNION ALL SELECT 7 AS m UNION ALL SELECT 8 AS m UNION ALL SELECT 9 AS m UNION ALL SELECT 10 AS m UNION ALL SELECT 11 AS m UNION ALL SELECT 12 AS m) b
    WHERE CONCAT(a.y, '-', b.m, '-01') BETWEEN CURDATE() - INTERVAL 13 MONTH AND CURDATE() - INTERVAL 1 MONTH
    ORDER BY 1, 2) d
    LEFT OUTER JOIN
    (SELECT YEAR(purchasedate) AS Y ,MONTH(purchasedate) AS m, COUNT(*) cnt FROM purchase WHERE productid=1001 AND purchasedate >= CURDATE() - INTERVAL 1 YEAR GROUP BY m, Y) p ON d.m=p.m AND d.y=p.y
ORDER BY 1 DESC, 2

您没有做错任何事,但 MySQL 无法返回数据集中不存在的月份的行。要解决这个问题,您需要提供您自己的所有月份(此查询中的表 d)并使用您的数据集的结果LEFT JOIN它们

关于mysql - 使用mysql间隔按月分组获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32865088/

相关文章:

java - MySQL JDBC 中的服务器端游标支持

php - 我想将文本和日期等数据从 HTML FORM 插入 PHP 到 MYSQL 数据库

java - 是什么导致错误java.sql.SQLException : cannot parse parameter definition :IN `device_id` CHAR(24)

mysql - Gcloud sql代理启动脚本运行但报错

mysql - 使用在 MySQL 存储过程中不起作用的 Max() 函数将最大 Id 提取到变量中

php - 如何为单个用户隐藏特定时间段的记录?

php - 高级自定义字段在管理屏幕上运行缓慢

php - 按结果数对 SQL 查询进行排序

mysql - MySql 和 Node.js 中的批处理

mysql - 在表中显示主键列