2013-10-16 80 views
0

我想對某個月份的amount列以及前一個月的總和進行求和。現在是第一個月的全部工作,但其後每個月都過高至少2個數量級。與上個月相比,MySQL月份總計月數更多

SELECT month, year, total, previous_month, previous_year, previous_total FROM (
    SELECT MONTH(p1.start_date) AS month, 
    YEAR(p1.start_date) AS year, 
    SUM(p1.amount) AS total, 
    SUM(p2.amount) AS previous_total, 
    MONTH(DATE_SUB(p1.start_date, INTERVAL 1 MONTH)) AS previous_month, 
    YEAR(DATE_SUB(p1.start_date, INTERVAL 1 MONTH)) AS previous_year 
    FROM trackings p1 
    LEFT JOIN trackings p2 ON EXTRACT(YEAR_MONTH FROM DATE_SUB(p1.start_date, INTERVAL 1 MONTH)) = EXTRACT(YEAR_MONTH FROM p2.start_date) 
    GROUP BY EXTRACT(YEAR_MONTH FROM p1.start_date) 
) AS p3; 

相關問題:我在做同樣的DATE_SUB 3倍。有沒有辦法清理日期相關的部分以提高效率?

樣品:http://sqlfiddle.com/#!2/3013a/1

+1

請一些樣本輸入輸出闡述。我沒有跟隨。 – JackDev

+0

我同意JackDev。否則,這只是猜測。 –

+1

@JackDev道歉。創建了一個SQL小提琴來展示我的意思。第一個月正確合計,但從第二行開始,輸出不正確(對於total和previous_total) – Chris

回答

1

認爲這個問題是你得到的行算的上參加多次。也就是說,你有一個月的所有金額的總和,但該月的每一行都與上一個月的所有行相連接。

解決方案使用了幾個子選擇: -

SELECT ThisMonth.MONTH, ThisMonth.YEAR, ThisMonth.TOTAL, PrevMonth.MONTH AS PREVIOUS_MONTH, PrevMonth.YEAR AS PREVIOUS_YEAR, PrevMonth.TOTAL AS PREVIOUS_TOTAL 
FROM 
(
    SELECT MONTH(start_date) AS `month`, 
      YEAR(start_date) AS `year`, 
      EXTRACT(YEAR_MONTH FROM start_date) AS YearMonth, 
      SUM(amount) AS total 
    FROM trackings 
    GROUP BY `month`, `year`, YearMonth 
) ThisMonth 
LEFT OUTER JOIN 
(
    SELECT MONTH(start_date) AS `month`, 
      YEAR(start_date) AS `year`, 
      EXTRACT(YEAR_MONTH FROM DATE_ADD(start_date, INTERVAL 1 MONTH)) AS YearMonth, 
      SUM(amount) AS total 
    FROM trackings 
    GROUP BY `month`, `year`, YearMonth 
) PrevMonth 
ON ThisMonth.YearMonth = PrevMonth.YearMonth