0

我有一个 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

它不是列的聚合,所以 unpivot 或 transpose 是否有效?

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

4

1 回答 1

1

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

取消透视

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。根据您的 SQL Server 版本,您还可以将 CROSS APPLY 与 VALUES 一起使用:

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

于 2013-09-04T18:27:02.943 回答