2

次のようなテーブルがあるとします。

タスクの種類 可変時間 期間
1 AX 10 5
AY 40 15 1 回
1BX 100 29
2 AX 5 2
2 BX 15 9
2 AY 60 17
18 年度 3 回 5

task-type-variable の組み合わせにより、各行が一意になります。

次のようなピボット テーブルを取得するにはどうすればよいですか。

                            XY
ワンアアワーズ 10 40
               期間 5 15
1 B 時間 100 0     
               期間 29 0
二時間 5 60
               期間 2 17
2 B 時間 15 0
               期間 9 0
スリー・ア・アワーズ 0 18
               期間 0 5

これはSQLでも可能ですか?Excelでできることはわかっています。

4

1 に答える 1

1

これは本当に、UNPIVOTそして、PIVOTです。次のコードは、1 つのクエリで目的の結果を実現します。

DECLARE @t TABLE (
    Task     varchar(5),
    Type     char(1),
    Variable char(1),
    Hours    int,
    Duration int
    ) 

INSERT INTO @t
    VALUES
        ('One',   'A', 'X',  10,  5),
        ('One',   'A', 'Y',  40, 15),
        ('One',   'B', 'X', 100, 29),
        ('Two',   'A', 'X',   5,  2),
        ('Two',   'B', 'X',  15,  9),
        ('Two',   'A', 'Y',  60, 17),
        ('Three', 'A', 'Y',  18,  5)

SELECT
        P.Task,
        P.Type,
        CAST(P.Property AS varchar(8)) AS Property,
        COALESCE(P.X, 0) AS X,
        COALESCE(P.Y, 0) AS Y
    FROM @t AS T
    UNPIVOT (
        Value FOR Property IN (
            Hours,
            Duration
            )
        ) AS U
    PIVOT (
        SUM(Value) FOR Variable IN (
            X,
            Y
            )
        ) AS P

これにより、次の結果が得られます。

Task  Type Property X           Y
----- ---- -------- ----------- -----------
One   A    Duration 5           15
One   A    Hours    10          40
One   B    Duration 29          0
One   B    Hours    100         0
Three A    Duration 0           5
Three A    Hours    0           18
Two   A    Duration 2           17
Two   A    Hours    5           60
Two   B    Duration 9           0
Two   B    Hours    15          0

ご覧のとおり、時間と期間が反転しています。PIVOT単独で注文を強制する方法はないと思います。Propertyこれは、他の列が最初に正しくソートされていることを確認する別の方法があれば、ソート順が関連付けられた値で別のテーブルに結合することで簡単に解決できます。

于 2010-07-02T19:21:52.937 に答える