2015-09-30 29 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

相關問題