如何在行相同的位置连接数据?



我有一个表,列 1 中有重复值,列 2 中有唯一值。如何在第 2 列中连接在第 1 列中找到重复值的文本,而不删除重复项。

我的表结构示例:

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

所需的输出:

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

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

将 LEFT JOIN for 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

在这里你可以看到演示

对于旧版本的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 ;

这是演示

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

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

在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 Server 2017 中的 Smilar 函数STRING_AGG、PostgreySTRING_AGG()和 OracleLISTAGG