【问题标题】: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
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