2

Let's say I have a table like this:

Task   Type   Variable   Hours    Duration
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

Where the combination of task-type-variable makes each row unique.

How can I get a pivot table like the following:

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

Is this even possible in SQL? I know Excel can do this.

4

1 回答 1

1

这真的是一个UNPIVOT和一个PIVOT。以下代码在单个查询中实现了所需的结果。

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 回答