PIVOT
この結果には a を使用できます。列の数がわかっている場合は、それらをハードコーディングできます。
select *
from
(
select p.productid,
p.productname,
i.imagefilename,
'ImageFile_' +
cast(row_number() over(partition by i.productid
order by i.productid) as varchar(10)) col
from tblproducts p
left join tblProductImages i
on p.productid = i.productid
) x
pivot
(
max(imagefilename)
for col in ([ImageFile_1], [ImageFile_2], [ImageFile_3])
) p
デモで SQL Fiddle を参照してください
または、動的 SQL を使用してPIVOT
. ダイナミクスは、次の数が変化した場合に機能しますimagefilename
。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ','
+ QUOTENAME('ImageFile_'+ cast(x.rn as varchar(10)))
from
(
select row_number() over(partition by i.productid
order by i.productid) rn
from tblProductImages i
) x
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT productid, productname,' + @cols + '
from
(
select p.productid,
p.productname,
i.imagefilename,
''ImageFile_'' +
cast(row_number() over(partition by i.productid
order by i.productid) as varchar(10)) col
from tblproducts p
left join tblProductImages i
on p.productid = i.productid
) x
pivot
(
max(imagefilename)
for col in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください
どちらの結果も次のようになります。
PRODUCTID | PRODUCTNAME | IMAGEFILE_1 | IMAGEFILE_2 | IMAGEFILE_3
==================================================================
1 | Product 1 | Image1 | Image2 | Image3
2 | Product 2 | Image1 | Image2 | (null)
3 | Product 3 | Image1 | (null) | (null)
4 | Product 4 | Image1 | Image2 | Image3
5 | Product 5 | Image1 | (null) | (null)