Could somebody please help me how to achieve the following?
Table:
ID NAME ROLE 1 KONDA LEAD 1 SATHI CO-LEAD 1 JOHN CO-LEAD 2 REDDY LEAD 2 SURESH CO-LEAD 3 PRASAD LEAD
My output should look like
ID LEAD CO-LEAD_1 CO-LEAD_2 1 KONDA SATHI JOHN 2 REDDY SURESH 3 PRASAD
Thanks Inadvance.
Advertisement
Answer
We can use conditional aggregation with the help of ROW_NUMBER():
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY ID, ROLE ORDER BY NAME) rn
FROM yourTable t
)
SELECT
ID,
MAX(CASE WHEN ROLE = 'LEAD' THEN NAME END) AS LEAD,
MAX(CASE WHEN ROLE = 'CO-LEAD' AND rn = 1 THEN NAME END) AS "CO-LEAD_1",
MAX(CASE WHEN ROLE = 'CO-LEAD' AND rn = 2 THEN NAME END) AS "CO-LEAD_2",
FROM cte
GROUP BY ID
ORDER BY ID;
To create a view, use:
CREATE VIEW yourView AS
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY ID, ROLE ORDER BY NAME) rn
FROM yourTable t
)
SELECT -- same as above