[英]SQL: Pivoting on more than one column
我有桌子
Name | Period | Value1 | Value2
-----+---------+---------+-------
A 1 2 3
A 2 5 4
A 3 6 7
B 1 2 3
B 2 5 4
B 3 6 7
我需要類似的結果
Name | Value1 | Value2
-----+--------+------
A | 2,5,6 | 3,4,7
B | 2,5,6 | 3,4,7
周期數是動態的,但我知道如何處理,為簡單起見,假設有3個周期
以下查詢為我提供了Value1的結果。 如何獲得兩者的結果? 我總是可以分別將它們分開,然后進行聯接,但是表確實很大,我需要“組合”四個值,而不是兩個。 我可以一句話做嗎?
SELECT Name,
[1]+','+ [2] + ','+ [3] ValueString
FROM (
select Name, period, cpr from #MyTable
) as s
PIVOT(SUM(Value1)
FOR period IN ([1],[2],[3])
使用條件聚合。 將值組合成字符串有點棘手,這需要SQL Server中的XML邏輯:
select n.name,
stuff((select ',' + cast(value1 as varchar(max))
from t
where n.name = t.name
order by t.period
for xml path ('')
), 1, 1, ''
) as values1,
stuff((select ',' + cast(value2 as varchar(max))
from t
where n.name = t.name
order by t.period
for xml path ('')
), 1, 1, ''
) as values2
from (select distinct name
from t
) n;
您的值看起來像數字,因此是顯式的強制轉換,並且不必擔心XML特殊字符。
您可能會問為什么在子查詢中而不是外部查詢中這樣做有distinct
? 如果在外部查詢中完成,則SQL引擎可能會在執行distinct
之前對每一行進行匯總。 我不確定優化程序是否足夠好,每個名稱僅運行一次子查詢。
通過填充功能使用分組依據並獲得預期結果
SELECT Name , STUFF((SELECT ',' + CAST(Value1 AS VARCHAR) FROM #MyTable T2 WHERE T1.Name = T2.Name FOR XML PATH('')),1,1,'') Value1
, STUFF((SELECT ',' + CAST(Value2 AS VARCHAR) FROM #MyTable T3 WHERE T1.Name = T3.Name FOR XML PATH('')),1,1,'') Value2 FROM #MyTable T1 GROUP BY Name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.