1

このウェブサイトで他のいくつかの提案に従ってみましたが、何らかの理由でこれを機能させることができませんでした.

基本的に、私はこのタスクのテーブルから取得しようとしています:

| TaskID | ProjectID | TaskType | TaskDate1 | TaskDate2 |
---------------------------------------------------------
|      1 |         1 |    Type4 |  20130401 |  20130506 |
|      2 |         1 |    Type0 |  20130412 |  20130508 |
|      3 |         1 |    Type2 |  20130420 |  20130517 |

その人に:

| ProjectID | Type0Date1 | Type0Date2 | Type2Date1 | Type2Date2 | Type4Date1 | Type4Date2 |
---------------------------------------------------------
|         1 |   20130412 |   20130508 |   20130420 |   20130517 |   20130401 |   20130506 |

各プロジェクトには、いくつかの事前定義されたタスク (タイプによって識別されます) がそれぞれ必要です。これらのタスクには多くのプロパティがありますが、私は 2 つの日付に興味があり、プロジェクトごとにすべてを 1 行にまとめるとよいでしょう。

次のようにして、列の 1 つに簡単にピボットできます。PIVOT (MAX(TaskDate1) FOR TaskType IN ([Type0],[Type2],[Type4]))

TaskType 列を複製して、TaskDate2 に対して別のピボットを実行しようとしましたが、1 行になりません。

また、同様の質問に対する他の投稿での提案と同様に、最初にテーブルのピボットを解除すると、必要な場所に到達する方法について頭を悩ませることもできません。

これを行うスケーラブルな方法がある場合 (さらに多くの列をピボットする場合など)、知っておくとよいでしょう。

ありがとう。

4

1 に答える 1

2

目的の結果を得ることができますが、複数の列 (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 |
于 2013-11-07T14:13:00.530 に答える