mysql - 如何在 sql 中获得这种枢轴类型的输出
问题描述
考虑下面给出的我的源表,即客户。
如何使用 sql (oracle 或 mysql) 获得所需的输出
顾客 :
customer id Purchase_id cashback
123 abc111 5
123 abc112 5
123 abc113 2
345 abc311 0
345 abc312 2
678 abc611 4
678 abc612 3
678 abc613 5
需要的输出:
ID purchare_id_1 purchare_id_2 purchare_id_3 cashback_1 cashback_2 cashback_3
123 abc111 abc112 abc113 5 5 2
345 abc311 abc312 0 2
678 abc611 abc612 abc613 4 3 5
DML 和 DDL:
create table cust_table (
customer_id int, Purchase_id varchar(100), cashback int
);
insert into cust_table values
(123 , 'abc111' , 5),
(123 , 'abc112' , 5),
(123 , 'abc113' , 2),
( 345 , 'abc311' , 0),
(345 , 'abc312' , 2),
(678 , 'abc611' , 4),
(678 , 'abc612' , 3),
(678 , 'abc613' , 5);
commit;
PS:数据可能不是静态的,它可以改变。
解决方案
WITH
cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY Purchase_id) rn
FROM cust_table )
SELECT customer_id,
MAX(CASE WHEN rn=1 THEN Purchase_id END) purchase_1,
MAX(CASE WHEN rn=2 THEN Purchase_id END) purchase_2,
MAX(CASE WHEN rn=3 THEN Purchase_id END) purchase_3,
MAX(CASE WHEN rn=1 THEN cashback END) cashback_1,
MAX(CASE WHEN rn=2 THEN cashback END) cashback_2,
MAX(CASE WHEN rn=3 THEN cashback END) cashback_3
FROM cte
GROUP BY customer_id
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ec2de721d7089a82a5f7ae669ce2d19e
推荐阅读
- vue.js - 包含另一个组件的组件的事件冲突
- sql-server - 无法在 DataGridView 的自动完成文本框列中包装文本
- simulation - 我可以在 CBE 热舒适工具中使用地球温度吗?
- c# - 如何在 SQL Server 选定列中传递值
- caching - 内层高速缓存是否可以写回包含在内的外层高速缓存中?
- javascript - chrome.windows.onRemoved.addListener 已弃用?
- maven - 运行多个 Maven 配置文件 + Cucumber JVM
- python - 如何使用 python 在 csv 文件中保持前导零?
- node.js - 写入 InfluxDB 时 Node-RED 上的“错误:读取 ECONNRESET”
- python - 检查 groupby 中的值是否存在于数据框中