自从我做过任何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,但到目前为止还没有取得任何成功。
任何帮助将不胜感激。
答案 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