在T-SQL中不使用While或Cursor复制

时间:2009-11-23 10:50:37

标签: sql sql-server tsql csv concatenation

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。请写一个相同的查询。

4 个答案:

答案 0 :(得分:3)

此查询应该这样做 - 使用SQL Server 2005中新增的FOR XML PATH - 希望您在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

答案 1 :(得分: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)

答案 2 :(得分:1)

对于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

答案 3 :(得分:0)

您可以对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