| id | col1 |
|---|---|
| 1 | John |
| 1 | Mary |
| 2 | Patricia |
| 2 | Charlie |
| 3 | Jane |
| 3 | Karen |
| 3 | MJ |
| 3 | Roland |
The output should look like this
| id | values |
|---|---|
| 1 | John,Mary |
| 2 | Patricia, Charlie |
| 3 | Jane, Karen, MJ,Roland |
CodePudding user response:
In MySQL, MariaDB and SQLite, you can use the GROUP_CONCAT aggregation function:
SELECT id,
GROUP_CONCAT(col1) AS values_
FROM tab
GROUP BY id
In PostgreSQL and SQL Server, you can use the STRING_AGG aggregation function:
SELECT id,
STRING_AGG(col1, ',') AS values_
FROM tab
GROUP BY id
In Oracle and DB2, you can use the LISTAGG aggregation function:
SELECT id,
LISTAGG(col1, ',') WITHIN GROUP(ORDER BY col1) AS values_
FROM tab
GROUP BY id
CodePudding user response:
The answer depends on the DB you use. Lemon showed already good ways for the different DB's.
I just want to add another one since STRING_AGG was introduced in SQL Server 2017. If you use an older SQL Server DB, you can use STUFF instead:
SELECT DISTINCT t1.id,
STUFF(
(SELECT ',' col1
FROM yourtable t2
WHERE t1.id = t2.id
FOR XML PATH (''))
,1,1,'') AS "values"
FROM yourtable t1;
CodePudding user response:
For Oracle 11gR2 and later...
Select
ID,
ListAgg(COL1, ', ') OVER(PARTITION BY ID ORDER BY ID) "VALUES"
From tbl
Group by ID
Order by ID
