TSQL:将多行结果显示为1行

3
大家好,
我不太确定如何做以下操作。我正在学习SQL,并使用SQL Server 2008 R2。请注意,虽然我可以执行所有所需的选择查询,但我没有在数据库中创建删除表的权限。
在我的数据库中,有一个名为“messages”的表。每个消息都是三个字母的代码(例如,“AAA”,“AAB”等)。每个主键可以有任意数量的消息。因此,就这个练习而言,假设该表如下:
1 AAA
1 AAB
1 AAC
2 AAA
2 CCC

我想要的输出是将水平数据转换为垂直数据,以便我可以得到这样的结果:

1 AAA AAB AAC
2 AAA CCC

如果相关的话,数据库还包含一个不同表中所有可能消息代码的列表。
我猜正确的答案涉及到 PIVOT,但我不太确定如何做到这一点。我找到的最接近的是这个:How to pivot table with T-SQL? 但是,(a) 我不确定如何适应我的情况和 (b) 它似乎需要创建一个新表。
提前感谢。

1
你是想让整个表格只有一行吗?还是只是格式不正确? - univerio
@M.Ali:你为什么编辑了输出结果?如果你需要对期望的输出结果进行澄清,应该留下评论。(就像univerio所做的那样) - Raging Bull
1
@M.Ali:你是不是修改了输出结果,只是为了让它看起来像你的答案? - fnightangel
1
进入编辑模式,看看 OP 尝试展示了什么,仅仅为了让我的回答看起来像是正确的而编辑输出结果是荒谬的。如果你仔细阅读问题,它是关于消息的,而且一条消息被分成了三行。如果有任何意义的话。 - M.Ali
点击这个链接并查看问题在编辑模式下的样子。@fnightangel,在指责某人之前,请确保你掌握了事实。 - M.Ali
好的,那就是我一开始做的。问题是现在我们有两个已经修正的解决方案。一个是更新前的,一个是更新后的。如果在编辑之前有人给你点了踩,对此我很抱歉。让我们等待@user2561252看到。 - fnightangel
2个回答

3
由于您的问题已经被编辑,包括两个查询:
原始问题中的期望结果查询:
;WITH CTE AS (
SELECT T2.ID, STUFF(
(SELECT ' '+ T1.Code
FROM TableName T1
WHERE T1.ID = T2.ID
FOR XML PATH('')),1,1,'') AS CSV
FROM TableName AS T2
GROUP BY T2.ID)

SELECT TOP 1  STUFF(
(SELECT ' ' + s.Temp
FROM (SELECT CONVERT(varchar(10),ID)+' '+CSV as Temp 
FROM CTE) s
FOR XML PATH('')),1,1,'') AS Result

结果:

RESULT
1 AAA AAB AAC 2 AAA CCC

请在SQL Fiddle中查看结果。

编辑后的问题的查询语句:

SELECT T2.ID, STUFF(
(SELECT ' '+ T1.Code
FROM TableName T1
WHERE T1.ID = T2.ID
FOR XML PATH('')),1,1,'') AS Codes
FROM TableName AS T2
GROUP BY T2.ID

结果:

ID  CODES
1   AAA AAB AAC
2   AAA CCC

SQL Fiddle中查看结果。


0

测试数据

DECLARE @TABLE TABLE(MessageID INT, Body VARCHAR(100))
INSERT INTO @TABLE VALUES
(1, 'AAA'),
(1, 'AAB'),
(1, 'AAC'),
(2, 'AAA'),
(2, 'CCC')

查询

SELECT t.MessageID,
       STUFF((SELECT ' ' + Body
              FROM @TABLE 
              WHERE MessageID = t.MessageID
              FOR XML PATH(''),TYPE)
              .value('.','NVARCHAR(MAX)'),1,1,'')
                    AS FullMessage
FROM @TABLE t
GROUP BY t.MessageID

结果集

╔═══════════╦═════════════╗
║ MessageID ║ FullMessage ║
╠═══════════╬═════════════╣
║         1 ║ AAA AAB AAC ║
║         2 ║ AAA CCC     ║
╚═══════════╩═════════════╝

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接