2010-02-26 64 views
6

在這裏有一個question在相同的標題,但這不是我正在尋找。
我有一個像下面我如何將行轉換爲sql server 2005中的列

Name | Count 
----------------  
Chery | 257 
Drew | 1500 
Morgon | 13 
Kath | 500 
Kirk | 200 
Matt | 76 

我需要trasform這個結果集弄成這個樣子

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 

一表我如何達致這使用SQL Server 2005?

回答

5

有類似的問題herehere回答計算器。

您需要使用運營商PIVOT在查詢中acheive this.Here是你如何能做到that.The例如從this源引用的例子和說明。

---I assumed your tablename as TESTTABLE--- 
DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t.Name 
         FROM TESTTABLE AS t 
         ORDER BY '],[' + t.Name 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

SET @query = N'SELECT '+ @cols +' FROM 
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p 
PIVOT (MAX([Count]) FOR Name IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

說明

1.查詢的第一部分

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
         '],[' + t.Name 
       FROM TESTTABLE AS t 
       ORDER BY '],[' + t.Name 
       FOR XML PATH('') 
      ), 1, 2, '') + ']' 

爲您提供您的姓名列值的一個很好的扁平結果單行如下

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt] 

你可以用lea更多關於STUFF和XML路徑herehere

2. SELECT + @cols + FROM將選擇所有的行作爲coloumn名字最終結果集(PVT - 步驟3)

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3。這個查詢拉出了我們創建交叉表結果所需的所有數據行。第(p)在查詢之後創建,然後可以用來滿足查詢步驟1.

(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p 

4. PIVOT表達

PIVOT (MAX (Count) FOR Name IN (@cols) AS pvt 

結果的臨時表執行實際總結並將結果放置到名爲PVT一個臨時表作爲

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 
+0

+1,很好的解決方案和答案。請注意,「TOP 100 PERCENT」可以更改爲「TOP 30」或其他任何內容,因此如果行數很多,則不會超過列數。 – 2010-02-26 21:03:44

2

請參閱Using PIVOT and UNPIVOT

您可以使用PIVOTUNPIVOT 關係運算符來改變 表值表達式到另一個 表。 PIVOT通過從一個列中的輸出轉動獨特 值在 表達爲多列在 旋轉的表值 表達,並且執行在那裏它們被要求在該是 希望在最終的任何 其餘列值聚合 輸出。 UNPIVOT 通過將 表值表達式的列轉換爲 值的值來執行與 PIVOT相反的操作。

簡單的回答是

SELECT Chery, Drew, Morgon, Kath, Kirk, Matt 
FROM 
(SELECT [Name], [Count] From Foo) 
PIVOT 
(
    MIN([Count]) 
    FOR [Name] IN (Chery, Drew, Morgon, Kath, Kirk, Matt) 
) AS PivotTable 
0

如果你想避免太多複雜的樞軸或接受的答案,你可以做到這一點! (大部分代碼是剛剛建立,以防萬一有人想嘗試一下測試數據)

/* set up your test table */ 
declare @TestData table (Name Varchar(80),[Count] int)  
insert into @TestData (Name, [count]) 
Select 'Chery' as name, 257 as [count] 
union all select 'Drew', 1500 
union all select 'Morgon',13 
union all select 'Kath', 500 
union all select 'Kirk', 200 
union all select 'Matt', 76 

/* the query */ 
Declare @Query Varchar(max) 
Select @Query=Coalesce(@query+', ','SELECT ') +Convert(VarChar(5),[count]) +' as ['+name+']' 
from @TestData 
Execute (@Query) 
/* result 

Chery  Drew  Morgon  Kath  Kirk  Matt 
----------- ----------- ----------- ----------- ----------- ----------- 
257   1500  13   500   200   76 

*/