首页 > 解决方案 > 如何在 mysql 中调整平均值

问题描述

我试图显示我有预订的所有月份,以及每个月的预订/客户的运行平均值,但似乎无法理解这是如何实现的,我不明白为什么我的查询出错。

我尝试了几种方法,一种是组合两个查询的方法,另一种是在一个查询中编写

第一个查询返回我们有订单的所有月份:

SELECT date_format(Orders.ServiceDate, '%y-%b') from Orders
GROUP BY YEAR(Orders.ServiceDate), month(Orders.ServiceDate)

第二个查询是计算每个客户一个月内的平均预订量:

(
SELECT AVG(cc.total) + 1 AS 'avg' FROM (
SELECT Orders.Customer_ID as 'c', 
COUNT(BookingId) 'total' from Orders
where year(Orders.ServiceDate) <= '2019' and month(Orders.ServiceDate)
<= '01'
GROUP BY Orders.Customer_ID
) cc
)

最后一个查询给了我一个数字,这是截至 2019 年 1 月之前每位客户的平均预订量,但我需要第一次查询后所有月份的平均值。

但是我需要从第一个查询中获取年份和月份,以便获得每个月的平均值,最终显示如下:

19-Jan    1.5
19-Feb    2
...
...

我尝试加入他们没有运气,所以我希望有一个善良的灵魂可以进一步帮助我。

我尝试的第二件事是不加入这样的查询:

SELECT
  date_format(z1.ServiceDate, '%y-%b') as months,
  (
    SELECT
      AVG(cc.total) + 1 AS 'avg'
    FROM
      (
        SELECT
          z.Customer_ID,
          COUNT(z.BookingId) 'total'
        from
          Orders z
        where
            YEAR(z.ServiceDate) <= YEAR(z1.months) AND
            MONTH(z.ServiceDate) <= MONTH(z1.months)
        GROUP BY
          z.Customer_ID
      ) cc
  )
from
  Orders z1
GROUP BY
  YEAR(z1.ServiceDate),
  MONTH(z1.ServiceDate)

这是我的架构:

CREATE TABLE IF NOT EXISTS `orders` (
  `BookingId` INT(6) NOT NULL,
  `ServiceDate` DATETIME NOT NULL,
  `Customer_ID` varchar(1) NOT NULL,
  PRIMARY KEY (`BookingId`)
) DEFAULT CHARSET=utf8;
INSERT INTO `orders` (`BookingId`, `ServiceDate`, `Customer_ID`) VALUES
  ('1', '2019-01-03T12:00:00', '1'),
  ('2', '2019-01-04T12:00:00', '2'),
  ('3', '2019-01-12T12:00:00', '2'),
  ('4', '2019-02-03T12:00:00', '1'),
  ('5', '2019-02-04T12:00:00', '2'),
  ('6', '2019-02-012T12:00:00', '3');

我期待看到两个平均值,一个只包含到一月,另一个包含二月,但我不断收到错误:“'where 子句中的未知列'z1.months'”。

我怎样才能使这个查询工作?

标签: mysql

解决方案


推荐阅读