如何行转换成列?(How to convert rows to columns?)

2019-10-18 12:17发布

我有这样一个表:

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

救命? 谢谢

Answer 1:

让我问一个问题,希望这将说明为什么它没有做你所期望的。

你要

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

但同样你可以有

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

如何数据库决定在同一直线上是黄色和蓝色走? 没有什么原始表的两行绑在一起。

该数据库不知道哪个的黑色或蓝色关联黄色,所以也没有与它关联的两种。



Answer 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


Answer 3:

使用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


文章来源: How to convert rows to columns?