I would like to transpose rows into columns in Snowflake.
Suppose I have the following table BASE
| ID | value | type |
|---|---|---|
| 1 | 100 | ‘A’ |
| 1 | 200 | ‘B’ |
| 1 | 300 | ‘B’ |
| 2 | 400 | ‘A’ |
The output should be as follows:
| ID | A | B |
|---|---|---|
| 1 | 100 | 200 |
| 1 | 100 | 300 |
| 2 | 400 | NULL |
Currently I am pivoting the table with
SELECT ID, CASE WHEN TYPE = 'A' THEN VALUE ELSE NULL AS A, CASE WHEN TYPE = 'B' THEN VALUE ELSE NULL AS B FROM BASE
For now the GROUP BY statement is missing. Typically I would GROUP BY ID, but that does not account for keeping one row per each value on the same TYPE and ID.
Any ideas how to achieve this?
Cheers, P
Advertisement
Answer
You can use conditional aggregation. You can use row_number() to get multiple rows:
SELECT ID,
MAX(CASE WHEN TYPE = 'A' THEN VALUE END) AS A,
MAX(CASE WHEN TYPE = 'B' THEN VALUE END) AS B
FROM (SELECT B.*,
ROW_NUMBER() OVER (PARTITION BY ID, TYPE ORDER BY VALUE) as seqnum
FROM BASE B
) B
GROUP BY ID, seqnum;