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