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

时间:2014-05-06 18:30:24

标签: sql-server sql-server-2008 tsql

所有

不太确定如何执行以下操作。使用SQL Server 2008 R2自学SQL。请注意,虽然我可以执行所有我喜欢的选择查询,但我没有权限在数据库中创建删除表。

在我的数据库中,有一个名为"的消息。"每条消息都是三字母代码(例如,' 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)它似乎需要创建一个表格。

提前谢谢。

2 个答案:

答案 0 :(得分: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中的结果。

答案 1 :(得分: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     ║
╚═══════════╩═════════════╝