2015-04-02 38 views
0

創建/日期的選擇行使用下面的嵌套查詢SELECT ... UNION SELECT ...我可以返回月/年的行過去6個月(含當月)動態在MySQL

SELECT month_year 
FROM 
    (SELECT DATE_FORMAT(NOW(),'%M %Y') as month_year 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 3 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 4 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 5 MONTH),'%M %Y') 
    ) a 

導致─

month_year 
April 2015 
March 2015 
February 2015 
January 2015 
December 2014 
November 2014 

是否有可能重新創建此查詢,以便動態創建,即不必添加/刪除UNION SELECT ...以獲取更多/更少的月/年行?

顯然,下面的查詢將不能工作,但有一些方法做一些喜歡 -

SELECT month_year 
FROM 
    (SELECT DATE_FORMAT(`thisDate`,'%M %Y') as month_year WHERE `thisDate` BETWEEN NOW() AND DATE_SUB(NOW(), INTERVAL 5 MONTH) LIMIT 6 
) a 

,我只需要改變INTERVAL 5LIMIT 6整數改變的行數返回。


應用

如果我有一個表sales每行是在當天賣出金額。

date   amount 
2015-01-03 100 
2015-01-10 50 
2015-03-07 75 
2015-03-14 60 
2015-03-21 40 
... 
2014-10-31 125 

現在我想要得到過去6個月的每月總計。如果我做一個標準的查詢,使用LIMIT 6

SELECT 
    DATE_FORMAT(date,'%M %Y') as month_year, SUM(amount) 
FROM 
    sales 
GROUP BY 
    month_year 
LIMIT 6 

我將結束與October 2014因爲有來自April 2015 OR February 2015沒有行。

所以我的想法是創建日期行的「臨時」表,然後LEFT JOINsales查詢 -

SELECT a.month_year, b.amount 
FROM 
    (SELECT DATE_FORMAT(NOW(),'%M %Y') as month_year 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 3 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 4 MONTH),'%M %Y') 
    UNION 
    SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 5 MONTH),'%M %Y') 
) a 
LEFT JOIN 
    (SELECT 
     DATE_FORMAT(date,'%M %Y') as month_year, SUM(amount) 
    FROM 
     sales 
    GROUP BY 
     month_year 
    ) b 
ON b.month_year = a.month_year 

但是,如果我想換月至7,8,9或3,4,5我將不得不添加/刪除行,我希望能夠更改1或2個整數。

+0

您能說您的使用有點?我的意思是,在一個日期字段上做一個組很簡單,而使用MySQL生成一堆沒有附加數據的月份會有點荒謬,所以這是一個可以在更多的上下文中得到更好回答的問題。 – 2015-04-02 21:39:00

+0

https://dev.mysql.com/doc/refman/5.0/en/while.html – 2015-04-02 21:53:12

+0

@JohnGreen我已更新我的問題與查詢的應用程序。 – Sean 2015-04-02 22:08:19

回答

0

我相信你可以使用這個

您可以設置多大的改變「間隔XX月」搜索。

缺點是:如果最後一個月沒有銷售,那麼該月將不會出現在查詢結果中。

SELECT 
MONTH(`date`) AS period, 
SUM(ammount) AS clicks 
FROM `sales` 
WHERE `date` >= CURDATE() - INTERVAL 10 MONTH 
GROUP BY period 

學分:Group by date range on weeks/months interval

+0

你的'缺點'是問題所在。我希望最近6個月,即使該月份返回NULL或0數量。 – Sean 2015-04-02 22:29:38