Как объединить данные, где строки одинаковы? - PullRequest
0 голосов
/ 16 января 2020

У меня есть таблица с повторяющимися значениями в Column1 и уникальными значениями в Column2. Как объединить текст в столбце 2, где в столбце 1 обнаружены повторяющиеся значения, без удаления дубликатов.

Пример структуры моей таблицы:

+-----------+-----------+
|  Column1  |  Column2  |
+-----------+-----------+
|  Employ1  |  Values1  |
+-----------+-----------+
|  Employ1  |  Values2  |
+-----------+-----------+
|  Employ2  |  Values3  |
+-----------+-----------+
|  Employ3  |  Values4  |
+-----------+-----------+

Требуемый вывод:

+-----------+--------------------+
|  Column1  |       Column2      |
+-----------+--------------------+
|  Employ1  |  Values1, Values2  |
+-----------+--------------------+
|  Employ1  |  Values1, Values2  |
+-----------+--------------------+
|  Employ2  |      Values3       |
+-----------+--------------------+
|  Employ3  |      Values4       |
+-----------+--------------------+

Я понятия не имею, как это сделать, поэтому, к сожалению, не могу предоставить код того, что у меня уже есть.

Ответы [ 3 ]

2 голосов
/ 16 января 2020

Используйте LEFT JOIN для SQLServer в сочетании с функцией string_agg

select T.column1, A.Column2
from TestT T
left join 
(select column1, string_agg(Column2, ',') Column2
from TestT
group by column1) A
on T.column1 = A.column1

Здесь вы можете увидеть DEMO

Для более старой версии SQLSERVER (Начиная с SQLServer 2017, я считаю, что функция string_agg доступна ...) попробуйте создать функцию:

CREATE FUNCTION dbo.udf_select_concat ( @c varchar(50) )
RETURNS VARCHAR(MAX) AS BEGIN
DECLARE @p VARCHAR(MAX) ;
       SET @p = '' ;
    SELECT @p = @p + Column2 + ' '
      FROM TestT
     WHERE column1 = @c ;
RETURN @p
END;

И затем вызвать ее так:

SELECT column1, replace(rtrim(dbo.udf_select_concat( column1 )), ' ', ',') Column2
FROM TestT
GROUP BY column1 ;

Вот ДЕМО

1 голос
/ 16 января 2020

в mysql вы можете использовать group_concat(), а для ожидаемого результата вам понадобится подзапрос и объединиться с исходной таблицей

with cte as
(
select Column1,group_concat(Column2) as val from table
group by Column1
) select a.column1, cte.val from table_name a join cte on a.column1=cte.column1

Смиларная функция в sql на сервере 2017 равна STRING_AGG и в Postgrey STRING_AGG() и в oracle LISTAGG

1 голос
/ 16 января 2020

В SQL Server 2017, вы можете использовать функцию STRING_AGG (), как показано ниже.

SELECT Column1  ,STRING_AGG(Column2,',')
FROM YOUR_TABLE
GROUP BY Column1
...