2015-10-14 130 views
0

我已經從命令日期到發送日期的平均持續時間的worte SQL查詢。這是我的電子商務項目。但我想與前一個月進行比較。與上個月相比的平均值

SELECT AVG(DATEDIFF(os.time, o.ordered)) AS average_value, 
     YEAR(os.time) AS groupYear, 
     MONTH(os.time) AS groupMonth 
FROM orders AS o 
     LEFT JOIN order_status_history os ON o.id = os.order_id 
WHERE os.status_id = 2 
GROUP BY groupyear, groupmonth 

我想要從上個月的選擇平均值。我已經嘗試LEFT JOIN與ON -1個月。但它表現出不好的價值,所以這可能不是正確的方式。

o.ordered和os.time都是Datetime。

謝謝大家的幫助。

+0

將os.status_id = 2條件移動到ON子句以獲得真正的左連接行爲!因爲它現在它作爲一個普通的內部聯接執行... – jarlh

+0

Okey,感動。謝謝......但它不能解決我的問題。 –

+0

是從時間戳類型os.time? –

回答

0

這未經測試。如果它不工作,你可以張貼一些的sampleData和創建報表

SELECT AVG(DATEDIFF(os.time, o.ordered)) AS average_value, 
     YEAR(os.time) AS groupYear, 
     MONTH(os.time) AS groupMonth 
FROM orders AS o 
LEFT JOIN order_status_history os ON o.id = os.order_id 
LEFT JOIN (
      SELECT AVG(DATEDIFF(os.time, o.ordered)) AS average_value, 
        YEAR(os.time) AS groupYear, 
        MONTH(os.time) AS groupMonth 
      FROM orders AS o 
      LEFT JOIN order_status_history os ON o.id = os.order_id 
      WHERE os.status_id = 2 
      GROUP BY DATE_FORMAT(os.`time`, '%Y%my') 
     ) AS l ON l.groupYear = YEAR(SUBDATE(os.time, INTERVAL 1 MONTH)) AND l.groupMonth = MONTH(SUBDATE(os.time, INTERVAL 1 MONTH)) 
WHERE os.status_id = 2 
GROUP BY DATE_FORMAT(os.`time`, '%Y%my'); 
+0

我忘記插入**,l。***在字段列表 –

+0

我完成了它。它的作品感謝您的幫助和時間! –

0

我的解決辦法是創建一個子查詢第一個觀點:

CREATE VIEW MonthlyValue AS   
SELECT YEAR(os.time) AS groupYear, 
     MONTH(os.time) AS groupMonth, 
     os.status_id, 
     AVG(DATEDIFF(os.time, o.ordered)) AS average_value 
FROM orders AS o 
     LEFT JOIN order_status_history os ON o.id = os.order_id 
GROUP BY groupyear, groupmonth,os.status_id; 

然後你可以使用視圖來獲得以前的信息和當前月份:

SELECT tc.groupYear as year, tc.groupMonth as month, tp.groupYear prevYear, tp.groupMonth as prevMonth, 
    mv.average_value, mvprev.average_value, mv.average_value - mvprev.average_value as difference 
FROM MonthlyValue mv join MonthlyValue mvprev on mv.status_id=mvprev.status_id and 
    (mv.groupYear=mvprev.groupYear and mvprev.groupMonth=mv.groupMonth-1 or 
      mv.groupMonth=1 and mvprev.groupMonth=12 and mvprev.groupYear=mv.groupYear-1) 
WHERE mv.status_id = 2; 
+0

我也會試試我。謝謝! –