如何连接行相同的数据?
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
我有一个 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