sql - 通过行聚合和新列创建转换表
问题描述
我是新来发布表格视图,所以我将尝试解释我的数据的外观:我有客户 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,也许以不同的方式编写查询会更好?
解决方案
您可以使用条件聚合:
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;
推荐阅读
- c - 我的动态分配的二维数组打印出没有意义的随机乱码
- amazon-web-services - 如何在 Amazon S3 上安全地存储图像
- python - Sqlalchemy 查询以计算值在列中存在的次数
- azure - Azure 恢复服务计划任务继续禁用
- hive - 在 28 PRECEDING 和 1 PRECEDING 之间的天数 -> 正在使用什么数据范围
- ms-access - 访问自定义功能区 (USysRibbons) 上的 PDF 按钮
- python-3.x - 如何使 Python 中的代码更高效,因为该程序会为大型输入数据集提供时间执行错误
- php - 如何让 jQuery 在返回之前等待 Ajax 调用完成
- c++ - 是 reinterpret_cast
(myTypePtr) 假设指向一个数组? - c++ - 如何将零填充的多维数组传递给 C++ 中的函数?