将SQL行聚合到单个列中

将SQL行聚合到单个列中,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我想使用MS SQL将列的结果聚合到一行中 我创建了一个sql FIDLE,展示了这个问题: 基本上,我希望所有的“标记”结果都在同一行,按不同的标记分组 因此,在上面的示例结果中,我希望结果如下: Id | Tag | OptionText 1 | IsMobile | Yes 1 | Mission | I am buying this, I am using this 我得到的最接近的方法是使用STUFF函数,但我似乎无法正确获得它,因为它输出每行上的所有OptionT

我想使用MS SQL将列的结果聚合到一行中

我创建了一个sql FIDLE,展示了这个问题:

基本上,我希望所有的“标记”结果都在同一行,按不同的标记分组

因此,在上面的示例结果中,我希望结果如下:

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
以下是该查询的结果:

这将是您的查询:

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小提琴:

结果:
╔════╦══════════╦══════════════════════════════════╗
║ Id ║   Tag    ║           Concatenated           ║
╠════╬══════════╬══════════════════════════════════╣
║  1 ║ IsMobile ║ Yes                              ║
║  1 ║ Mission  ║ I am buying this,I am using this ║
╚════╩══════════╩══════════════════════════════════╝