Sql 如何将行转换为列?

Sql 如何将行转换为列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张这样的桌子: Name Value --------------- toyota yellow nissan blue toyota red nissan black toyota nissan ---------------------- yellow NULL NULL blue red NULL NULL black 我想将该表转换为: toyota nissan ---------------

我有一张这样的桌子:

Name     Value
---------------
toyota   yellow
nissan   blue
toyota   red
nissan   black
toyota     nissan
----------------------
yellow     NULL
NULL       blue
red        NULL
NULL       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
但结果是这样的表:

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

帮忙?谢谢

让我问一个问题,希望它能说明为什么它没有达到你的预期

你想要

toyota    nissan
----------------
yellow    blue
red       black
但同样地,你也可以

toyota    nissan
----------------
yellow    black
red       blue
数据库如何决定黄色和蓝色在同一条线上?原始表格中没有任何内容可以将这两行连接在一起


数据库不知道将黄色与黑色或蓝色中的哪一个相关联,因此它也不将黄色与黑色或蓝色相关联。

让我问一个问题,希望它能说明为什么它没有达到预期效果

你想要

toyota    nissan
----------------
yellow    blue
red       black
但同样地,你也可以

toyota    nissan
----------------
yellow    black
red       blue
数据库如何决定黄色和蓝色在同一条线上?原始表格中没有任何内容可以将这两行连接在一起


数据库不知道将黄色与黑色或蓝色中的哪一个相关联,因此它也不将黄色与黑色或蓝色中的哪一个相关联。

使用完全外部联接

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

使用完全外部联接

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

也可以使用
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

也可以使用
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

我希望“toyota”和“nissan”列下的每个值都按照原始表格中显示的顺序列出。因为在原来的表格中,“toyota”先显示黄色,然后再显示红色,这就是我希望它出现在新表格中的方式。日产也是如此。这可能吗?@user2689893表上没有自然顺序,因此“原始表中显示的顺序”不存在。这一次可能是这个顺序,但不能保证它不会在另一个查询中更改。如果您想要订单,您需要明确指定我想要的订单,以便“toyota”和“nissan”列下的每个值都按照原始表格中显示的顺序列出。因为在原来的表格中,“toyota”先显示黄色,然后再显示红色,这就是我希望它出现在新表格中的方式。日产也是如此。这可能吗?@user2689893表上没有自然顺序,因此“原始表中显示的顺序”不存在。这一次可能是这个顺序,但不能保证它不会在另一个查询中更改。如果你想要一个订单,你需要明确地指定它,效果很好,但是我发现如果我添加另一行(例如丰田,绿色),它会将行拆分回去。取决于用户2689893想要做什么。效果很好,但我发现如果我添加另一行(例如丰田、绿色),它会将行拆分回去。取决于用户2689893想要做什么。