I am trying to combine few rows combine and output as 1 row. Here is my example and my expected output. I have tried group_concat and put if/ case condition in query but it seems somehow cannot output as I expected. Thanks in advance.
x
Data:
id | Type | Name |Supermarket
1 Fruit Apple East
2 Fruit Orange West
3 Fruit Pear Central
Expected Output:
Type |East |West |Central
Fruit Apple Orange Pear
Advertisement
Answer
The duplicate questions I looked up for this didn’t have very clear answers IMHO, so I’ll write one:
First we need to spread the data we are interested in across 3 columns:
SELECT
type,
CASE WHEN supermarket = 'east' THEN name END as east,
CASE WHEN supermarket = 'west' THEN name END as west,
CASE WHEN supermarket = 'central' THEN name END as central
FROM t
Run that and you’ll see the data spread out to 3 rows and 3 columns, mostly nulls. Now we need to get rid of the nulls. If we use MAX() on every column with nulls we will hide everything except the one cell that has a value (max will always pick a value over null)
SELECT
type,
MAX(CASE WHEN supermarket = 'east' THEN name END) as east,
MAX(CASE WHEN supermarket = 'west' THEN name END) as west,
MAX(CASE WHEN supermarket = 'central' THEN name END) as central
FROM t
GROUP BY type