如何连接行相同的数据?

How to concatenate data where rows are the same?

我有一个 table,在 Column1 中有重复值,在 Column2 中有唯一值。如何在 Column1 中发现重复值的情况下连接 Column2 中的文本,而不删除重复项。

我的 table 结构示例:

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

需要的期望输出:

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

我不知道该怎么做,所以很遗憾无法提供我已有的代码。

在 SQL Server 2017 中,您可以使用如下所示的 STRING_AGG() 函数。

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

在 mysql 中您可以使用 group_concat() 并且对于您的预期结果需要一个子查询并加入原始 table

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

smilar 函数在 sql 服务器 2017 中是 STRING_AGG,在 postgrey 中是 STRING_AGG(),在 oracle 中是 LISTAGG

结合使用 SQLServer 的 LEFT JOIN 和 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 ;

这里是 DEMO