目的の結果を得ることができますが、複数の列 (TaskDate1
およびTaskDate2
) でピボットする必要があるため、最初に 2 つの列を複数の行にアンピボットします。
SQL Server 2008 以降を使用しているため、UNPIVOT 関数または CROSS APPLY を使用して複数の列を変換できます。基本的な構文は次のとおりです。
select projectid,
col = TaskType+col,
value
from yourtable
cross apply
(
values
('Date1', TaskDate1),
('Date2', TaskDate2)
) c(col, value)
SQL Fiddle with Demoを参照してください。これにより、データが使いやすい形式に変換されます。
| PROJECTID | COL | VALUE |
|-----------|------------|------------------------------|
| 1 | Type4Date1 | April, 01 2013 00:00:00+0000 |
| 1 | Type4Date2 | May, 06 2013 00:00:00+0000 |
| 1 | Type0Date1 | April, 12 2013 00:00:00+0000 |
| 1 | Type0Date2 | May, 08 2013 00:00:00+0000 |
この形式のデータを取得したら、 PIVOT 関数を適用してmax(value)
for each を取得できcol
ます。
select projectId,
Type0Date1, Type0Date2,
Type2Date1, Type2Date2,
Type4Date1, Type4Date2
from
(
select projectid,
col = TaskType+col,
value
from yourtable
cross apply
(
values
('Date1', TaskDate1),
('Date2', TaskDate2)
) c(col, value)
) d
pivot
(
max(value)
for col in (Type0Date1, Type0Date2, Type2Date1, Type2Date2,
Type4Date1, Type4Date2)
) piv;
SQL Fiddle with Demoを参照してください。
上記のバージョンは、 ごとの値の数が限られているProjectId
場合にうまく機能しますが、各プロジェクトのタスクの数が不明な場合は、動的 SQL を使用して最終結果を取得する必要があります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(TaskType+col)
from yourtable
cross apply
(
select 'Date1', 1 union all
select 'Date2', 2
) c(col, so)
group by col, tasktype, so
order by tasktype, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT projectid, ' + @cols + '
from
(
select projectid,
col = TaskType+col,
value
from yourtable
cross apply
(
values
(''Date1'', TaskDate1),
(''Date2'', TaskDate2)
) c(col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
execute sp_executesql @query
SQL Fiddle with Demoを参照してください。これらは結果を与えます:
| PROJECTID | TYPE0DATE1 | TYPE0DATE2 | TYPE2DATE1 | TYPE2DATE2 | TYPE4DATE1 | TYPE4DATE2 |
|-----------|------------------------------|----------------------------|------------------------------|----------------------------|------------------------------|----------------------------|
| 1 | April, 12 2013 00:00:00+0000 | May, 08 2013 00:00:00+0000 | April, 20 2013 00:00:00+0000 | May, 17 2013 00:00:00+0000 | April, 01 2013 00:00:00+0000 | May, 06 2013 00:00:00+0000 |