The next table is a simplification of my problem in SQL Server:
ID COLUMN_A COLUMN_B COLUMN_C ------------------------------------- 1 A B C 1 A B D 1 B C D
I want to get a group with the columns concatenated by comma without repeated values. I tried to use STRING_AGG() but it returns:
ID COLUMN_A COLUMN_B COLUMN_C ------------------------------------- 1 A, A, B B, B, C C, D, D
This is the query I have done:
SELECT ID, STRING_AGG(COLUMN_A, ', ') AS COL_A, STRING_AGG(COLUMN_B, ', ') AS COL_B, STRING_AGG(COLUMN_C, ', ') AS COL_C FROM MYTABLE GROUP BY ID;
I would like the next result:
ID COLUMN_A COLUMN_B COLUMN_C ------------------------------------- 1 A, B B, C C, D
Thank you!
Advertisement
Answer
Without using window functions
. The union
might slow things down, but give it a try and see if you can tolerate the performance.
with cte1 (id, col, indicator) as (select id, column_a, 'col1' from t union select id, column_b, 'col2' from t union select id, column_c, 'col3' from t), cte2 (id, indicator, agg) as (select id, indicator, string_agg(col,',') from cte1 group by id, indicator) select id, max(case when indicator='col1' then agg end) as column_a, max(case when indicator='col2' then agg end) as column_b, max(case when indicator='col3' then agg end) as column_c from cte2 group by id;