【问题标题】:Aggragation on a time range and aggregation on all time in a single query在单个查询中聚合时间范围和聚合所有时间
【发布时间】:2020-01-28 17:44:16
【问题描述】:

我被要求编写一个与 MySQL/PostgreSQL 兼容的单一查询,该查询显示销售代表(sales_rep 此处)在给定月份的总销售额,并在另一列中显示同一个人全年的平均月销售额。到目前为止我提出的查询如下:

SELECT sr.name, SUM(s.amount) as total, ??
  FROM sales_rep as sr, sales as s
    WHERE sr.id = s.sales_rep_id
      AND s.date >= '2000-12-01' 
      AND s.date < '2001-01-01'
  GROUP BY sr.name
  ORDER BY total DESC 
LIMIT 10;

你可以在这里试试:http://sqlfiddle.com/#!17/67c65/10

【问题讨论】:

  • 最好让新生在他们到达“提问”页面之前通过 MCRE(和类似的)页面。请@草莓。
  • @nnn 如果只是...
  • 我不知道这是可能的。我现在用它来更新我的问题。
  • 现在我已经更新了问题,@nnn 可以提供答案吗?
  • 如果答案(非窗口函数)没有给你解决方案,我会回答。

标签: mysql sql postgresql


【解决方案1】:

你可以使用窗口函数:

SELECT YEAR(s.date), MONTH(s.date), sr.name, SUM(s.amount) as total, 
       SUM(SUM(s.amount)) OVER () / 12 as monthly_average
FROM sales_rep sr JOIN
     sales s
     ON sr.id = s.sales_rep_id
WHERE s.date >= '2000-12-01' AND s.date < '2001-01-01'
GROUP BY sr.name, YEAR(s.date), MONTH(s.date);

注意:这会将没有销售的月份计算为 0。如果您想忽略它们:

SELECT YEAR(s.date), MONTH(s.date), sr.name, SUM(s.amount) as total, 
       AVG(SUM(s.amount)) OVER () as monthly_average
FROM sales_rep sr JOIN
     sales s
     ON sr.id = s.sales_rep_id
WHERE s.date >= '2000-12-01' AND s.date < '2001-01-01'
GROUP BY sr.name, YEAR(s.date), MONTH(s.date);

【讨论】:

  • 查询无效,不允许返回年份和月份。
【解决方案2】:
SELECT sr.name, SUM(s.amount) as total, avg(s.amount) as average
FROM sales_rep as sr
join sales as s
on sr.id = s.sales_rep_id
where s.date >= '2000-12-01' 
AND s.date < '2001-01-01'
GROUP BY sr.name
LIMIT 100;

请使用显式连接。 这意味着你将改变这一点:

FROM sales_rep as sr, sales as s
WHERE sr.id = s.sales_rep_id

用这个:

FROM sales_rep as sr
join sales as s
on sr.id = s.sales_rep_id

最后,在您限制前 100 个之前,按数量或平均值而不是按名称排序是有意义的。因此,这个解决方案:

SELECT sr.name as name, SUM(s.amount) as total, avg(s.amount) as average
FROM sales_rep as sr, sales as s
WHERE sr.id = s.sales_rep_id
AND s.date >= '2000-12-01' 
AND s.date < '2001-01-01'
GROUP BY sr.name
order by total
limit 100;

【讨论】:

  • 公平投票,我同意。我正在编辑...仍然...再次...我同意...谢谢
  • @LearnerFor-life 请告诉我这里出了什么问题,以便我可以尝试更好。 sqlfiddle.com/#!17/67c65/17
  • 全年月平均销售额是错误的。对于那里的所有用户,它将是 50. (100+500)/12 和 (100+200+300)/12
  • 嗨@LearnerFor-life 可以吗:sqlfiddle.com/#!17/67c65/24
  • 我们都犯了那些看似无关紧要的错误,我当然也有过我的经历(也许更多)。只是希望他们在把小错误变成大问题之前被抓住。
猜你喜欢
  • 2010-12-16
  • 2012-09-18
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 2017-08-13
  • 2021-08-20
  • 1970-01-01
  • 2019-08-06
相关资源
最近更新 更多