【发布时间】:2020-11-17 03:38:52
【问题描述】:
https://www.db-fiddle.com/f/ssrpQyyajYdZkkkAJBaYUp/0的可运行查询示例
我有一个 postgres 销售表;每行都有一个sale_id、product_id、salesperson 和price。
我想为每个至少有一次销售的 (salesperson, product_id) 元组编写一个返回的查询:
-
price表示该销售人员为该产品所做的所有销售(请致电此product_sales)。 -
price的总数超过了该销售人员的所有销售额(调用此total_sales)。
我目前的查询如下,但我觉得写sum(sum(price))很傻。有没有更标准/惯用的方法?
select
salesperson,
product_id,
sum(price) as product_sales,
sum(sum(price)) over (partition by salesperson) as total_sales
from sales
group by 1, 2
order by 1, 2
写入 sum(price) 而不是 sum(sum(price)) 会产生以下错误:
column "sales.price" must appear in the GROUP BY clause or be used in an aggregate function
更新
-
请参阅this response 了解使用
WITH子句的好方法。我觉得我应该能够在没有子查询或WITH的情况下做到这一点。 -
刚刚偶然发现this response 提出了另一个问题,该问题提出了
sum(sum(...))和子查询方法。也许这些是最好的选择?
【问题讨论】:
-
您的方法是正确的方法。克服你的愚蠢。窗口函数非常强大,这是聚合的正确语法。
-
@GordonLinoff 很公平:-)
-
。 .我可能有点苛刻。我记得曾经有完全相同的反应。一两天就过去了。
标签: sql postgresql window-functions