[英]how to avoid sum(sum()) when writing this postgres query with window functions?
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
更新
您可以使用公用表表达式来简化查询并分两步完成。
例如:
with
s as (
select
salesperson,
product_id,
sum(price) as product_sales
from sales
group by salesperson, product_id
)
select
salesperson,
product_id,
product_sales,
sum(product_sales) over (partition by salesperson) as total_sales
from s
order by salesperson, product_id
结果:
salesperson product_id product_sales total_sales
------------ ----------- -------------- -----------
Alice 1 2000 5400
Alice 2 2200 5400
Alice 3 1200 5400
Bobby 1 2000 4300
Bobby 2 1100 4300
Bobby 3 1200 4300
Chuck 1 2000 4300
Chuck 2 1100 4300
Chuck 3 1200 4300
请参阅DB Fiddle 上的运行示例。
你可以试试下面的——
select * from
(
select
salesperson,
product_id,
sum(price) over(partition by salesperson,product_id) as product_sales,
sum(price) over(partition by salesperson) as total_sales,
row_number() over(partition by salesperson,product_id order by sale_id) as rn
from sales s
)A where rn=1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.