2015-09-30 27 views
1

我希望从按月份分组的购买表中获得最近1年的记录。重要的是要提到最近两个月没有购买,包括现在。 MySQL查询像下面使用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 

从最后一次购买日期

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 

返回11个月的数据,但它应该回路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 

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

回答

1

尝试这个

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他们与你的数据集的结果

+0

假设我有过去6年的数据,所以我的d表应该有6 * 12 = 72条目,例如(id ym) 1 2009 1,2 2009 2,3 2009 3 ....等等 –

+1

@ Alvi_1987,不,表'd'包含两个表'a'&'b'。现在'a'列出你想要的所有年份,'b'列出所有可能的12个月。目前'a'只返回2015年和2014年,如果您想添加更多年份,只需在'a'的子查询中添加'UNION ALL SELECT 2013 AS y'等等。 'CROSS JOIN'会为你处理乘法 – mynawaz

相关问题