I have this structure in table
TYPE DATE AMOUNT ID -------------------------------- B 30.6.2019 15 1 B 30.11.2019 20 1 C 22.12.2019 17 1 B 30.6.2019 15 2 B 30.11.2019 20 2 C 22.12.2019 17 2
and i need it in flat one row multiple columns structure
TYPE1 DATE1 AMOUNT1 TYPE2 DATE2 AMOUNT2 TYPE3 DATE3 AMOUNT3 ID ----------------------------------------------------------------------------------- B 30.6.2019 15 B 30.11.2019 20 C 22.12.2019 17 1 B 30.6.2019 15 B 30.11.2019 20 C 22.12.2019 17 2
Please help with the query.
Advertisement
Answer
In Oracle, You can use the PIVOT
as follows:
SQL> -- Sample data SQL> WITH YOUR_TABLE(TYPE,"DATE",AMOUNT,ID) AS 2 ( 3 SELECT 'B', TO_DATE('30.06.2019','DD.MM.RRRR'), 15, 1 FROM DUAL UNION ALL 4 SELECT 'B', TO_DATE('30.11.2019','DD.MM.RRRR'), 20, 1 FROM DUAL UNION ALL 5 SELECT 'C', TO_DATE('22.12.2019','DD.MM.RRRR'), 17, 1 FROM DUAL UNION ALL 6 SELECT 'B', TO_DATE('30.06.2019','DD.MM.RRRR'), 15, 2 FROM DUAL UNION ALL 7 SELECT 'B', TO_DATE('30.11.2019','DD.MM.RRRR'), 20, 2 FROM DUAL UNION ALL 8 SELECT 'C', TO_DATE('22.12.2019','DD.MM.RRRR'), 17, 2 FROM DUAL ) 9 -- Your query starts from here 10 SELECT * FROM ( 11 SELECT T.*, 12 ROW_NUMBER() OVER(PARTITION BY ID ORDER BY "DATE") AS RN 13 FROM YOUR_TABLE T 14 ) PIVOT ( 15 MAX ( TYPE ) AS TYPE, MAX ( "DATE" ) AS "DATE", MAX ( AMOUNT ) AS AMOUNT 16 FOR RN IN ( 1, 2, 3 ) 17 ); ID 1 1_DATE 1_AMOUNT 2 2_DATE 2_AMOUNT 3 3_DATE 3_AMOUNT ---------- - --------- ---------- - --------- ---------- - --------- ---------- 1 B 30-JUN-19 15 B 30-NOV-19 20 C 22-DEC-19 17 2 B 30-JUN-19 15 B 30-NOV-19 20 C 22-DEC-19 17 SQL>