我有一个表,列 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