将软件列转置或拆分为两列

时间:2013-09-04 18:22:07

标签: sql sql-server-2008 unpivot

我有一个SQL 2008表,每个计算机包含一行,包含许多软件标题列:

Computer      Col1        Col2        Col3          Col4
PC1           Acrobat     Word        Excel
PC2           Word        Access      
PC3           Google
PC4           Word        Excel       SQL2008       Maximizer

我想将它组合成两列,如下所示:

Computer        Software
PC1             Acrobat
PC1             Word
PC1             Excel
PC2             Word
PC2             Access
PC3             Google
PC4             Word
PC4             Excel
PC4             SQL2008
PC4             Maximizer

它不是列的集合,也是无法转换或转置工作?

每行包含1到32列数据。 软件名称有数百种不同的值。

1 个答案:

答案 0 :(得分:1)

您可以通过几种不同的方式取消数据,包括UNPIVOT函数或CROSS APPLY,以将多列转换为行。

<强> UNPIVOT

select computer, software
from yourtable
unpivot
(
  software 
  for col in ([Col1], [Col2], [Col3], [Col4])
) un;

请参阅SQL Fiddle with Demo

交叉申请:

select t.computer, c.software
from yourtable t
cross apply
(
  select col1 union all
  select col2 union all
  select col3 union all
  select col4
) c (software)
where c.software is not null;

SQL Fiddle with Demo。您还可以使用CROSS APPLY和VALUES,具体取决于您的SQL Server版本:

select t.computer, c.software
from yourtable t
cross apply
(
  values
    (col1), (col2),
    (col3), (col4)
) c (software)
where c.software is not null;

请参阅SQL Fiddle with Demo