【问题标题】:Average value compared to previous month与上个月相比的平均值
【发布时间】:2015-10-14 16:27:29
【问题描述】:

我已经编写了从订单日期到发送日期的平均持续时间的 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 

我也想选择上个月的平均值。我已经尝试使用 ON -1 个月的 LEFT JOIN。但它显示了不好的值,所以这可能不是正确的方法。

o.ordered 和 os.time 都是 Datetime。

感谢大家的帮助。

【问题讨论】:

  • 将 os.status_id = 2 条件移动到 ON 子句以获得真正的左连接行为!现在它作为常规内部连接执行...
  • 好吧,搬家了。谢谢...但这并不能解决我的问题。
  • 是来自时间戳类型的 os.time 吗?
  • 不,o.ordered 和 os.time 都是日期时间。

标签: mysql sql


【解决方案1】:

这未经测试。如果它不起作用,您可以发布一些示例数据并创建语句

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');

【讨论】:

  • 我忘记在字段列表中插入 ,l.*
  • 我完成了。感谢您的帮助和时间!
【解决方案2】:

我的解决方案是先为子查询创建一个视图:

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;

【讨论】:

  • 我也试试。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2021-07-13
相关资源
最近更新 更多