【问题标题】:grouping based on name [duplicate]基于名称分组[重复]
【发布时间】:2020-02-06 14:39:09
【问题描述】:

如何获取下表的详细信息

表1:

c1    c2    
ta     a    
tb     c    
ta     b    
tb     d    

通过同名分组,比如

ta    a,b
tb    c,d

在mssql中使用哪个函数

【问题讨论】:

  • 如果 2017+ 您正在寻找 string_agg() ,否则会出现 XML 方法。
  • 哪个 SQL Server 版本?

标签: sql sql-server


【解决方案1】:

你可以使用 XML 的东西组合

select distinct c1,
STUFF((Select ','+c2    
from table1 T1
where T1.c1 =T2.c1    
FOR XML PATH('')),1,1,'') from table1 T2

【讨论】:

  • 所有答案都是正确的,但我发现这个很简单:p
【解决方案2】:

取决于您的 SQL Server 版本;从 SQL 2017 开始,您可以使用

表格

DECLARE @t TABLE (C1 VARCHAR(255), C2 VARCHAR(25))
INSERT INTO @t VALUES 
('ta','a'),('tb','c'),('ta','b'),('tb','d')

查询

SELECT C1, STRING_AGG(C2,',')
FROM    @t
GROUP BY C1

【讨论】:

    【解决方案3】:

    我迟到了,但你走了:

    在 2017 年,字符串连接变得超级简单。

    在旧形式的 SQL Server 中,您可以使用多种技术来完成它,例如 FOR XML(由另一个用户展示)、联合、循环(虽然从技术上讲,这是另一种实现方式),当然还有递归 CTE 的黑暗艺术(在这个例子中可能是过度杀戮)。

    drop table #tmp;
    create table #tmp
        (
            c1 varchar(2)
            , c2 varchar (2)
        );
    
    INSERT INTO #tmp (c1, c2) VALUES
        ('ta', 'a'),
        ('tb', 'c'),
        ('ta', 'b'),
        ('tb', 'd');
    
    
    SELECT c1, STRING_AGG(c2, ',') AS Concat
    FROM #tmp
    GROUP BY C1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2017-01-31
      相关资源
      最近更新 更多