簡體   English   中英

SQL:在多個列上旋轉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM