2013-08-16 104 views
1

我有這樣一個表:如何將行轉換爲列?

Name  Value 
--------------- 
toyota yellow 
nissan blue 
toyota red 
nissan black 

我想錶轉換成這樣:

toyota nissan 
---------------- 
yellow blue 
red  black 

我怎樣才能做到這一點?

我嘗試使用這個命令:

SELECT * (CASE Name WHEN 'toyota' THEN Value END) toyota, 
     (CASE Name WHEN 'nissan' THEN Value END) nissan 
FROM testTable 

但是,這導致表是這樣的:

toyota  nissan 
---------------------- 
yellow  NULL 
NULL  blue 
red  NULL 
NULL  black 

幫助?謝謝

+2

[使用PIVOT和UNPIVOT](http://technet.microsoft.com/en-us/library /ms177410(v=sql.105).aspx) – 2013-08-16 15:28:24

回答

2

讓我問一個問題,並希望它會說明爲什麼它沒有做你期望的。

你想

toyota nissan 
---------------- 
yellow blue 
red  black 

但同樣你可以有

toyota nissan 
---------------- 
yellow black 
red  blue 

如何數據庫決定在同一直線上的黃色和藍色走?原始表格中沒有任何內容將兩行連接在一起。

數據庫不知道將哪個黑色或藍色與黃色關聯,因此它不會將其與任一個關聯。

+0

我喜歡這樣,'toyota'和'nissan'列下的每個值都按照原始表中顯示的順序列出。由於黃色首先顯示,然後在原始表格中顯示爲'toyota'的第二個紅色,這就是我在新表格中需要的。日產也一樣。這可能嗎? – user2689893

+2

@ user2689893表格中沒有自然順序,因此「原始表格中顯示的順序」不存在。它可以是這次的訂單,但不保證它不會在另一個查詢中更改。如果你想要一個訂單,你需要明確地指定它 – Lamak

2

使用完全外部連接

select toyota, nissan from 
(select value toyota, ROW_NUMBER() over (order by value desc) r 
     from testtable 
     where name = 'toyota') t 
    full outer join 
(select value nissan, ROW_NUMBER() over (order by value desc) r 
     from testtable 
     where name = 'nissan') n 
    on t.r =n.r 
2

使用pivot也是可能的:

declare @table table (Name varchar(50), Value varchar(50)) 
insert into @table values ('toyota', 'yellow'), ('nissan', 'blue'), 
    ('toyota', 'red'), ('nissan', 'black') 

;with t as (
    select *, rn = row_number() over (partition by Name order by Value) 
    from @table 
) 
select Toyota, Nissan 
from t 
    pivot (max(Value) for Name in ([Toyota],[Nissan])) p 
+0

很好,但是我發現如果我添加另一行(例如,豐田,綠色),它會將行分割出來。取決於user2689893想要做什麼。 – Jonny