繁体   English   中英

将 SQL 行聚合为单列

[英]Aggregate SQL Rows into single column

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

我创建了一个 sql fiddle 来展示这个问题:

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

那将是您的查询:

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 ║
╚════╩══════════╩══════════════════════════════════╝

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM