【问题标题】:Duplicates without using While or Cursor in T-SQL在 T-SQL 中不使用 While 或 Cursor 进行复制
【发布时间】:2009-11-23 10:50:36
【问题描述】:
ID           Name
1            A
1            B
1            C
2            X
2            Y
3            P
3            Q
3            R

这些是表中的列。我想得到像

这样的输出
ID    Company
    1 A,B,C
    2 X, Y
    3 P,Q,R

限制是我不能使用 WHILE 或 CURSOR。请写一个相同的查询。

【问题讨论】:

  • 什么版本的 SQL Server ???
  • 您希望公司名称作为逗号分隔列表吗?为什么?

标签: sql sql-server tsql csv concatenation


【解决方案1】:

这个查询应该这样做 - 使用FOR XML PATH,这是 SQL Server 2005 中的新功能 - 希望您使用的是 2005 或更高版本,但您没有明确指定.....

SELECT
    ID,
    STUFF(CAST((SELECT ','+Name FROM dbo.YourTable t2
                WHERE t2.ID = dbo.YourTable.ID
                FOR XML PATH(''), TYPE) AS VARCHAR(MAX)), 1, 1, '') AS 'Company'
FROM 
   dbo.YourTable
GROUP BY 
   ID

【讨论】:

    【解决方案2】:

    这是使用 CROSS APPLY 方法的解决方案:

    select id, sub.names
    from (
        select distinct id from YourTable
    ) a
    cross apply (
        select name + ', ' as [text()]
        from YourTable b
        where b.id = a.id
        for xml path('')
    ) sub(names)
    

    【讨论】:

      【解决方案3】:

      对于 2005 版:

      CREATE TABLE dbo.TEST([Type] INTEGER, [Name] NVARCHAR(100), [Qty] INTEGER)
      GO
      INSERT dbo.TEST VALUES(1, N'a', 5)
      INSERT dbo.TEST VALUES(1, N'b', 6)
      INSERT dbo.TEST VALUES(2, N'c', 44)
      INSERT dbo.TEST VALUES(3, N'd', 1)
      GO
      
      select [Type],
       [Description] = replace((select [Name] + ':' + cast([Qty] as varchar) as 'data()'     
      from TEST where [Type] = t.[Type] for xml path('')), ' ', ',')
      from dbo.TEST t
      group by [Type]
      
      go
      
      drop table dbo.TEST
      

      【讨论】:

        【解决方案4】:

        您可以对 ID 进行分组以获取唯一值,然后使用 for xml 查询为每个值获取逗号分隔的字符串:

        select
          a.ID,
          substring((
            select ', ' + Name
            from Test1
            where Test1.ID = a.ID
            for xml path('')
          ), 3, 1000) as Company
        from
          TheTable a
        group by
          a.ID
        

        【讨论】:

          猜你喜欢
          • 2020-10-17
          • 2020-10-20
          • 2012-02-26
          • 1970-01-01
          • 2021-11-29
          • 1970-01-01
          • 2014-02-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多