【问题标题】:Can't get both the sum of month and also the average sum per day of each month无法同时获得月份总和以及每个月每天的平均总和
【发布时间】:2020-02-04 10:27:34
【问题描述】:

我有一张表orders,我需要得到每个月的order_sum 的总和。使用组很容易。但是我还需要得到每个月每天的平均金额。我正在使用连接,以便稍后对结果进行排序。 (我使用的是 MySQL 5.6 版)

我收到一个错误:

“on 子句”中的未知列“orders.month”

这是我的orders 表:

+----+-----------+---------------------+
| id | order_sum | created_at          |
+----+-----------+---------------------+
| 1  | 25.13     | 2020-01-05 08:02:17 |
| 2  | 1.01      | 2020-01-25 20:13:20 |
| 3  | 5.04      | 2020-01-29 16:11:56 |
| 4  | 39.57     | 2020-02-17 15:14:09 |
| 5  | 63.01     | 2020-02-28 17:13:55 |
| 6  | 7         | 2020-03-02 07:10:02 |
+----+-----------+---------------------+

这是我的查询:

select
  MONTH(created_at) as month,
  sum(order_sum) as order_sum,
  second_table.avg_order_sum as average_per_day
from
  orders
inner join (
  select
    month(created_at) as month,
    avg(order_sum) as avg_order_sum
  from
    orders
) as second_table on orders.month = second_table.month
group by
  month;

这是我想要得到的结果

+-------+-----------+-----------------+
| month | order_sum | average_per_day |
+-------+-----------+-----------------+
| 1     | 31.18     | 10.39           |
| 2     | 102.58    | 51.29           |
| 3     | 7         | 7               |
+-------+-----------+-----------------+

我知道我可以使用这个简单的查询轻松获得每天的平均值,但我无法使用内部连接将其合并到一个查询中...

select month(created_at) as month, avg(order_sum) as average_per_day from orders group by month

这是架构

CREATE TABLE orders(
   id         INTEGER  NOT NULL PRIMARY KEY,
   order_sum  NUMERIC(11,2) NOT NULL,
   created_at VARCHAR(21) NOT NULL
);

INSERT INTO orders(id, order_sum, created_at) VALUES 
(1, 25.13, '2020-01-05 08:02:17'),
(2, 1.01, '2020-01-25 20:13:20'),
(3, 5.04, '2020-01-29 16:11:56'),
(4, 39.57, '2020-02-17 15:14:09'),
(5, 63.01, '2020-02-28 17:13:55'),
(6, 7.00, '2020-03-02 07:10:02');

这是一个模式: http://sqlfiddle.com/#!9/b6b15/10

【问题讨论】:

  • 当 GROUP BY 时,您只能 ORDER BY 选定的列。
  • 您通常GROUP BY 与您SELECT 相同的列,但那些作为设置函数的参数的列除外。

标签: mysql sql


【解决方案1】:

您可以简单地尝试:

SELECT month(created_at) AS month
    ,sum(order_sum) AS Order_Sum
    ,avg(order_sum) AS average_per_day
FROM orders
GROUP BY month

【讨论】:

  • 谢谢,这很简短。我不知道为什么我认为我需要加入。
【解决方案2】:

您需要在GROUP BYJOIN ON(不是别名)中引用MONTH(created_at),并将您的second_table 分组。这对我有用:

select
  MONTH(created_at) as month,
  sum(order_sum) as order_sum,
  second_table.avg_order_sum as average_per_day
from
  orders
inner join (
  select
    month(created_at) as month,
    avg(order_sum) as avg_order_sum
  from
    orders
  group by month(created_at)
) as second_table on MONTH(created_at) = second_table.month
group by
  MONTH(created_at);

【讨论】:

  • 一般来说,如果非聚合列出现在SELECT中,那么它也应该出现在GROUP BY中。
  • 我不知道为什么这个答案遭到了反对,如果我想加入的话,这不是一个坏答案。
  • 是的,另一个答案是 obv。更好,因为它显示了最简单的方法,我的方法是纠正您的解决方案中的错误。
  • 谢谢@PaulS,现在我也知道如何使用连接了。还是有用的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2020-02-13
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
相关资源
最近更新 更多