通过行聚合和新列创建转换表

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;

【讨论】:

以上是关于通过行聚合和新列创建转换表的主要内容,如果未能解决你的问题,请参考以下文章

如何将时间戳字段转换为 int8?或者只是删除该列并创建一个新列?

如何通过窗口函数过滤聚合函数的 SQL 语句中的行?

sql中的重复表并添加新列

Power BI:通过记录行索引将 JSON 记录转换为列

表之间的聚合行数差异

通过 Storyboard 和新 Xib 实现自定义表格部分标题