通过行聚合和新列创建转换表
Posted
技术标签:
【中文标题】通过行聚合和新列创建转换表【英文标题】:Transforming table with aggregation over rows and new column creation 【发布时间】:2021-07-05 01:10:21 【问题描述】:我是新来发布表格视图,所以我将尝试解释我的数据的外观: 我有客户 ID、订单 ID、销售日期、购买的产品以及产品的价格。我们销售 3 种产品:K、N 和 E。每行显示客户购买的产品及其价格。客户可以在同一订单中多次购买同一产品,也可以购买其他产品。下面我试图汇总每个产品的价格,这样最后我将为每个客户和订单创建一个列,并创建新的价格列。
目前正在编写 CTE:
with N as (select Customer_ID, Order_ID, Sales_Date,
sum(Price)
from orders
group by 1,2,3
where product = 'N'),
K as (select Customer_ID, Order_ID, Sales_Date,
sum(Price)
from orders
group by 1,2,3
where product = 'K'),
E as (select Customer_ID, Order_ID, Sales_Date,
sum(Price)
from orders
group by 1,2,3
where product = 'E')
select N.*,
K.Price as K_Price,
E.Price as E_Price
from N as N
left join K as K on K.Customer_ID=N.Customer_ID
left join E as E on E.Customer_ID=N.Customer_ID
有没有更有效的方法来做到这一点?如果产品选项从 3 个增加到 20 个 - 我将有 20 个 CTE,也许以不同的方式编写查询会更好?
【问题讨论】:
不要解释数据是什么样的。包括样本数据和期望的结果。清楚地解释你想要做什么也会有所帮助。我假设您的意思是每个客户有一个 行,每个价格都有一个单独的列。 【参考方案1】:您可以使用条件聚合:
select Customer_ID, Order_ID, Sales_Date,
sum(price) filter (where product = 'N') as n_price,
sum(price) filter (where product = 'K') as k_price,
sum(price) filter (where product = 'E') as e_price
from orders o
group by Customer_ID, Order_ID, Sales_Date;
【讨论】:
以上是关于通过行聚合和新列创建转换表的主要内容,如果未能解决你的问题,请参考以下文章