このデータ変換は として知られてPIVOT
おり、SQL Server 2005 以降では、データを行から列に変換する機能があります。
列に転置する静的な数の値があるかどうかに応じて、これを行う方法がいくつかあります。それらはすべて、データに a を追加することを伴うrow_number()
ため、任意の製品の複数の行を返すことができます。
CASE
式で集計関数を使用できます。
select
max(case when product = 'x' then detail end) x,
max(case when product = 'y' then detail end) y,
max(case when product = 'z' then detail end) z
from
(
select p.product, d.detail,
row_number() over(partition by p.product order by p.slno) rn
from product p
inner join detail d
on p.product = d.product
) src
group by rn
デモで SQL Fiddle を参照してください
PIVOT
次の関数を使用できます。
select x, y, z
from
(
select p.product, d.detail,
row_number() over(partition by p.product order by p.slno) rn
from product p
inner join detail d
on p.product = d.product
) src
pivot
(
max(detail)
for product in (x, y, z)
) piv
SQL Fiddle with Demoを参照してください。
列に変換する値 (この場合は製品) の数が不明な場合は、動的 SQL を使用する必要があります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(product)
from product
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select p.product, d.detail,
row_number() over(partition by p.product order by p.slno) rn
from product p
inner join detail d
on p.product = d.product
) x
pivot
(
max(detail)
for product in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください
すべてのクエリの結果は次のとおりです。
| X | Y | Z |
--------------------------
| good | bad | worse |
| bad | (null) | (null) |