2016-11-23 93 views
0

我有一個表SQL:樞軸上多列

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]) 
+0

只是注意,這是不是一個真正的支點 - 這是一個聚集。數據透視明確地將列中的值轉換爲新的列。在這種情況下,您可以爲每個時期創建列。 –

回答

4

使用條件聚合。值組合成字符串是有點棘手,需要XML邏輯在SQL Server:

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之前對之前的每個行進行聚合。我不確定優化器是否足夠好,每個名稱只能運行一次子查詢。

+2

可能希望按時間段添加按順序排列的東西查詢。 – SqlZim

+0

非常感謝。有用! – anjulis

+1

@SqlZim。 。 。好主意。 –

0

使用組通過與東西功能並獲得預期的結果

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