所有
不太确定如何执行以下操作。使用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)它似乎需要创建一个表格。
提前谢谢。
答案 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 ║
╚═══════════╩═════════════╝