Reputation: 19
I have a table with the following data:
col-1 col-2 col-3 col-4 col-5 col-6 col-7
----- ----- ----- ----- ----- ----- -----
10 2 30 13 A 0.1 0.3
10 2 30 13 B 0.2 0.9
10 2 30 13 C 0.8 0.7
10 2 30 13 D 0.4 0.5
2 1 8 11 A 0.3 0.4
2 1 8 11 B 0.9 0.2
2 1 8 11 C 0.1 0.8
2 1 8 11 D 0.2 0.5
I have to come up with the following table: (here col-1 to col-4 have same values for 4 different values of col-5)
col-1 col-2 col-3 col-4 A_6 B_6 C_6 D_6 A_7 B_7
----- ----- ----- ----- --- --- --- --- --- ---
10 2 30 13 0.1 0.2 0.8 0.4 0.3 0.9
2 1 8 11 0.3 0.9 0.1 0.2 0.4 0.2
Any idea how to achieve this?
Consider A_6 as A_COL_6 means Col_6 Value for A
Upvotes: 0
Views: 97
Reputation: 591
WITH
temp_t
AS
(SELECT '10' col_1,
'2' col_2,
'30' col_3,
'13' col_4,
'A' col_5,
0.1 col_6,
0.3 col_7
FROM DUAL
UNION ALL
SELECT '10', '2', '30', '13', 'B', 0.2, 0.9 FROM DUAL
UNION ALL
SELECT '10', '2', '30', '13', 'C', 0.8, 0.7 FROM DUAL
UNION ALL
SELECT '10', '2', '30', '13', 'D', 0.4, 0.5 FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'A', 0.3, 0.4 FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'B', 0.9, 0.2 FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'C', 0.1, 0.8 FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'D', 0.2, 0.5 FROM DUAL)
SELECT *
FROM temp_t
PIVOT (SUM (col_6) AS c6, SUM (col_7) AS c7
FOR (col_5)
IN ('A', 'B', 'C', 'D'))
Upvotes: 3
Reputation: 46229
You can use CASE WHEN
expression with Aggregate function
WITH T AS(
SELECT '10' col_1,'2' col_2,'30' col_3,'13' col_4,'A' col_5, '0.1' col_6,'0.3' col_7 FROM DUAL
UNION ALL
SELECT '10', '2', '30', '13', 'B', '0.2','0.9' FROM DUAL
UNION ALL
SELECT '10', '2', '30', '13', 'C', '0.8','0.7' FROM DUAL
UNION ALL
SELECT '10', '2', '30', '13', 'D', '0.4','.5' FROM DUAL
UNION ALL
SELECT '2' ,'1' ,'8' ,'11','A' , '0.3','0.4' FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'B', '0.9','0.2' FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'C', '0.1','0.8' FROM DUAL
UNION ALL
SELECT '2', '1', '8', '11', 'D', '0.2','0.5' FROM DUAL
)
SELECT COL_1,
COL_2,
COL_3,
COL_4,
MAX(CASE WHEN COL_5 = 'A' THEN COL_6 ELSE '0' END) A_6,
MAX(CASE WHEN COL_5 = 'B' THEN COL_6 ELSE '0' END) B_6,
MAX(CASE WHEN COL_5 = 'C' THEN COL_6 ELSE '0' END) C_6,
MAX(CASE WHEN COL_5 = 'D' THEN COL_6 ELSE '0' END) D_6,
MAX(CASE WHEN COL_5 = 'A' THEN COL_7 ELSE '0' END) A_7,
MAX(CASE WHEN COL_5 = 'B' THEN COL_7 ELSE '0' END) B_7
FROM T
GROUP BY
COL_1,
COL_2,
COL_3,
COL_4
SQLFIDDLE:http://sqlfiddle.com/#!4/b9bb1/21
Upvotes: 2