【问题标题】:How to concatenate data where rows are the same?如何连接行相同的数据?
【发布时间】:2020-01-16 10:17:04
【问题描述】:

我有一个表,其中 Column1 中有重复值,Column2 中有唯一值。如何在 Column1 中找到重复值的 Column2 中连接文本,而不删除重复项。

我的表结构示例:

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

所需的输出:

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

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

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS
  • 在 Postgres 中你可以使用string_agg()
  • 与 group_concat() 聚合并插入新表??
  • 这是我 Qlik Sense 项目的一部分,所以说实话,我不确定他们使用的是哪种 DBMS 产品。我现在已经尝试过 string_agg() 和 group_concat() 并且 Qlik Sense 说它不是有效的内置函数。
  • 试试select @@version;select version();select * from V$VERSION;

标签: sql string-aggregation


【解决方案1】:

结合使用 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

在这里你可以看到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

【讨论】:

  • @ben,如果 SQLServer 是您的数据库,请尝试我的回答中的第二个选项...
【解决方案2】:

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

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

【讨论】:

  • 这实际上会从 column1 中删除重复值。
【解决方案3】:

在 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,在 postgrey 中是 STRING_AGG(),在 oracle 中是 LISTAGG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2020-01-06
    • 2021-07-28
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多