我想使用MS SQL将列的结果聚合到一行。
我创建了一个sql小提琴,它展示了这个问题:
http://sqlfiddle.com/#!3/384d5/2
基本上我希望所有人都能使用标签。结果在同一行,按不同的标签分组
因此,在上面的示例结果中,我希望结果如此:
Id | Tag | OptionText
1 | IsMobile | Yes
1 | Mission | I am buying this, I am using this
我最接近的是使用STUFF函数,但我似乎无法正确获取它,因为它输出每行的所有OptionText值:
select Id, Tag, STUFF(CAST((
SELECT [text()] = ', ' + [OptionText]
FROM testing
FOR XML PATH(''), TYPE) AS
VARCHAR(max)), 1, 2, '') OptionText
from testing
group by Id, Tag
以下是该查询的结果:http://sqlfiddle.com/#!3/384d5/5
答案 0 :(得分:1)
那是你的疑问:
DECLARE @testing TABLE
(
Id INT
, Tag NVARCHAR(250)
, OptionText NVARCHAR(250)
);
INSERT INTO @testing
VALUES (1, 'IsMobile', 'Yes')
, (1, 'Mission', 'I am using this')
, (1, 'Mission', 'I am buying this');
SELECT T.Id, T.Tag, STUFF(Temp.Concatenated, 1, 1, '') AS Concatenated
FROM (
SELECT DISTINCT Id, Tag
FROM @testing
) AS T
CROSS APPLY (
SELECT DISTINCT ',' + OptionText AS [text()]
FROM @testing AS TT
WHERE TT.Id = T.Id
AND TT.Tag = T.Tag
FOR XML PATH('')
) AS Temp(Concatenated);
不幸的是,你必须两次查询你的桌子。一次 - 用标签获取唯一ID,第二次获得OptionText。 STUFF将删除在连接期间添加的第一个逗号。
这是一个SQL小提琴:http://sqlfiddle.com/#!3/5a0079/1
╔════╦══════════╦══════════════════════════════════╗
║ Id ║ Tag ║ Concatenated ║
╠════╬══════════╬══════════════════════════════════╣
║ 1 ║ IsMobile ║ Yes ║
║ 1 ║ Mission ║ I am buying this,I am using this ║
╚════╩══════════╩══════════════════════════════════╝