SQL查询列到行 - Unpivot?

时间:2014-08-08 11:18:19

标签: sql sql-server rows unpivot

自从我做过任何T-SQL以来已经有一段时间了。我试图找到一个这种格式的表:

Table 1

Equipment Number    Description Photo01 Photo02 Photo03 Photo04 Photo05
02M1.1  GRIT COLLECTOR  BC1DE498-F222-404B-AF32-50886FD8524D.jpg    2E005CE8-2B72-4744-B707-4B5F9B3626E9.jpg    44888857-B8C1-41BC-BED1-D301FBF98C16.jpg    NULL    NULL
02M1.2  GRIT COLLECTOR  10C3E477-F7E5-49A8-8E86-2641B04A57D9.jpg    A3E66016-EEBF-4543-972F-B04ABD753D0A.jpg    NULL    NULL    NULL

看起来像这样:

Table 2

EQNUM    Filename                                            Description
02M1.1   x:\Photos\BC1DE498-F222-404B-AF32-50886FD8524D.jpg  GRIT COLLECTOR
02M1.1   x:\Photos\2E005CE8-2B72-4744-B707-4B5F9B3626E9.jpg  GRIT COLLECTOR
02M1.1   X:\Photos\44888857-B8C1-41BC-BED1-D301FBF98C16.jpg  GRIT COLLECTOR
02M1.2   X:\Photos\10C3E477-F7E5-49A8-8E86-2641B04A57D9.jpg  GRIT COLLECTOR
02M1.2   X:\Photos\A3E66016-EEBF-4543-972F-B04ABD753D0A.jpg  GRIT COLLECTOR

表1中可以有0-5张图片。

我正在使用SQL 2008 R2。我想我必须使用UNPIVOT,但到目前为止还没有取得任何成功。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果您的表格不是那么大,最简单的方法可能是明确的union all

select t.*
from (select eqnum, photo1 as photo, description from table1 union all
      select eqnum, photo2, description from table1 union all
      select eqnum, photo3, description from table1 union all
      select eqnum, photo4, description from table1 union all
      select eqnum, photo5, description from table1
     ) t
where photo is not null;

您可以添加into子句来创建表。这个版本将读取表五次。 Unpivot效率更高,但如果您的表格有点大,表示数十万行或更多,那只会真正有所作为。

答案 1 :(得分:2)

您可以使用UNPIVOT函数将列转换为行:

select EquipmentNumber,
  FileName,
  DESCRIPTION
from yourtable
unpivot
(
  FileName 
  for Photo In (Photo01, Photo02, Photo03, Photo04, Photo05)
) u

请参阅Demo

由于您使用的是SQL Server 2005+,因此您还可以使用CROSS APPLY来转置数据。在您必须使用UNION ALL版本之前,VALUES子句在SQL Server 2008中可用:

select EquipmentNumber, FileName, DESCRIPTION
from yourtable
cross apply
(
  values
    ('Photo01', Photo01),
    ('Photo02', Photo02),
    ('Photo03', Photo03),
    ('Photo04', Photo04),
    ('Photo05', Photo05)
) c (photo, FileName)
where FileName is not null;

请参阅Demo