2014-07-09 81 views
0

考慮下表#document_fields如何將UNPIVOT列轉化爲行?

id x y z 
------------------ 
1 foo bar baz 
2 one two three 
3 aaa bbb ccc 
4 123 456 789 

列的數目可能會有所不同,因爲這樣做的列名。我需要的列轉動到行這樣的:

id field value 
--------------- 
1 x  foo 
1 y  bar 
1 z  baz 
2 x  one 
2 y  two 
2 z  three 
. 
. 
3 z  789 

我想了解在SQL Server的作品轉動方式,但不能得到任何比這再:

select 
     * 
into 
     #document_fields_pivot 
from (
     select * from (
      select * 
      from #document_fields 
    ) t 
     pivot (
      -- ?? 
    ) p 
) tbl 

任何人都可以幫我完成這個查詢/解釋我pivoting?任何幫助是極大的讚賞。

回答

2

你想要什麼叫做UNPIVOT,做像這樣:

select id,field,value from 
#document_fields 
unpivot 
(
value 
for field in (x,y,z) 
) as u 
order by id,field 

Demo

+0

謝謝!但我收到了一個錯誤:列「y」的類型與UNPIVOT列表中指定的其他列的類型衝突。我在另一個線程中讀取這是因爲所有的列必須具有相同的數據類型和長度。在這個例子中,是否有一種快速遍歷列(x,y和z,但據說可能還有數以百計)的快速方法,並將它們全部轉換爲相同的數據記錄和長度? – Pr0no

+0

不是我所知道的。不過,我很好奇你爲什麼會在你的桌子上有這種結構。我的意思是你不應該在一個專欄中有文字和數字嗎?或者我錯過了一些簡單的東西? –

+0

是的,它真的很簡單:)客戶希望以這種格式進行數據轉儲,以便在Excel中輕鬆過濾。所以這個腳本只是生成那個excel。當然,實際上所有的東西都應該存儲:) – Pr0no

1
DECLARE @Component table (ComponentId INT,Descr VARCHAR(10),Descr1 VARCHAR(10),Descr2 VARCHAR(10)) 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (1,'foo','bar','baz') 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (2,'one','two','three') 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (3,'aaa','bbb','ccc') 
INSERT INTO @Component (ComponentId,Descr,Descr1,Descr2)values (3,'123','456','789') 


    select 
     ComponentId,Field 
    from @Component P 

UNPIVOT 
(
    Field 
    FOR Value 
    IN (
    [Descr],[Descr1],[Descr2] 
    ) 
) PivotTable; 
+0

謝謝!但我得到一個錯誤:'列的類型「y」與在UNPIVOT列表中指定的其他列的類型衝突。我在另一個線程中讀取這是因爲所有的列必須具有相同的數據類型和長度。在這個例子中,是否有一種快速遍歷列(x,y和z,但據說可能還有數以百計)的快速方法,並將它們全部轉換爲相同的數據記錄和長度? – Pr0no

+0

轉換或轉換是有意義的。基於您提供的樣本數據,我寫了query..just修改根據您的要求 – mohan111