あなたは、列へのデータのあなたの行を変換するために、SQL Server 2008でPIVOT
機能を使用することができます。
select
id,
name,
BP, KS, TL
from
(
select id,
name,
type,
[date]
from mytable
) d
pivot
(
max([date])
for type in (BP, KS, TL)
) piv;
これはまた、いくつかの集約とCASE
表現のように、条件付きロジックを使用して記述できます。
select id,
name,
BP = max(case when type = 'BP' then [date] end),
KS = max(case when type = 'KS' then [date] end),
TL = max(case when type = 'TL' then [date] end)
from mytable
group by id, name;
name
とtype
の組み合わせで複数の日付を設定できるというご意見に基づいて、同様のクエリを使用することができます.wi row_number
のような機能を使って、あなたが望む最終結果を得ることができます。
あなたが条件ロジックのバージョンを使用したい場合は、あなたがするクエリを変更したい:
select
name,
BP1 = max(case when type = 'BP' and rn =1 then [date] end),
BP2 = max(case when type = 'BP' and rn =2 then [date] end),
BP3 = max(case when type = 'BP' and rn =3 then [date] end),
KS1 = max(case when type = 'KS' and rn =1 then [date] end),
KS2 = max(case when type = 'KS' and rn =2 then [date] end),
TL1 = max(case when type = 'TL' and rn =1 then [date] end)
from
(
select
name,
[type],
[date],
rn = row_number() over(partition by name, [type] order by [date] desc)
from mytable
) d
group by name;
PIVOTのバージョンは次のようになります。
select
name,
BP1, BP2, BP3, KS1, KS2, TL1
from
(
select
name,
type = type + cast(rn as varchar(2)),
[date]
from
(
select
name,
type,
[date],
rn = row_number() over(partition by name, [type] order by [date] desc)
from mytable
)s
) d
pivot
(
max([date])
for type in (BP1, BP2, BP3, KS1, KS2, TL1)
) piv;
あなたがそこにある見ることができるようにこれらの列をすべて取得するために多くのタイプを入力するので、動的SQLを使用して最終的な結果を得ることができます。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(Type + cast(rn as varchar(2)))
from
(
select type,
rn = row_number() over(partition by name, type order by date desc)
from mytable
) d
group by type, rn
order by type, rn
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT name, ' + @cols + N'
from
(
select
name,
type = type + cast(rn as varchar(2)),
[date]
from
(
select
name,
type,
[date],
rn = row_number() over(partition by name, [type] order by [date] desc)
from mytable
)s
) x
pivot
(
max(date)
for type in (' + @cols + N')
) p '
exec sp_executesql @query;
demoを作成して、すべて同じ結果を返すことを示します。
この問題を解決するには、TSQLの試みをお見せください。ありがとう! –
ピボットの問題は、26種類の異なるタイプにすることができ、1つの名前は同じクラスと異なる日付を持つことができるため、その場合は別の列を追加したいと考えています。 – Luis64