2015-10-14 75 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

我也会试试我。谢谢! –