ここに私のデータベース構造があります:
次のようなデータを表示したい:
どうすればできますか?ピボットを使用する必要がありますか?
これに使えますPIVOT
。PIVOT でこれを行うには 2 つの方法があります。変換する列をコーディングする静的ピボットか、実行時に列を決定する動的ピボットのいずれかです。
静的ピボット:
select *
from
(
select dt, username, product,
'product'
+ cast(row_number()
over(partition by username order by product) as varchar(10)) productNum
from yourtable
) x
pivot
(
min(product)
for productNum in ([product1], [product2], [product3])
) p
order by dt
デモで SQL Fiddle を参照してください
動的ピボット:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols =
STUFF((SELECT distinct ',' + Quotename('product'
+ cast(row_number()
over(partition by username order by product) as varchar(10)))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT dt, username,' + @cols + ' from
(
select dt, username, product,
''product''
+ cast(row_number()
over(partition by username order by product) as varchar(10)) productNum
from yourtable
) x
pivot
(
min(product)
for productNum in (' + @cols + ')
) p
order by dt'
execute(@query)
デモで SQL Fiddle を参照してください
はい、ピボットを使用する必要があります。
ただし、商品の数がわからない場合は、動的なピボットを使用する必要があります。このようなものです。