如何将行转换为列?

时间:2013-08-16 15:26:35

标签: sql sql-server tsql

我有一张这样的表:

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

帮助?感谢

3 个答案:

答案 0 :(得分:2)

让我问一个问题,希望它能说明为什么它没有按照你的预期行事。

你想要

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

但同样可以

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

数据库如何确定黄色和蓝色在同一行?原始表中没有任何内容将两行绑在一起。

数据库不知道将黄色与黄色相关联的黑色或蓝色,因此它不会将其与任何一个相关联。

答案 1 :(得分: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 :(得分: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