首页 > 解决方案 > 如何在 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:数据可能不是静态的,它可以改变。

标签: mysqlsqloracleoracle12c

解决方案


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


推荐阅读