2013-10-03 105 views
1

我有一個包含發貨的表(SQL Server 2008),因此「階段0」意味着「新貨」,並且連續階段是不同階段的貨件跟蹤。SQL-Server 2008中的樞軸表

我想下表轉動:

CREATE TABLE TableName 
    ([ID] int, [IDShip] int, [Date] datetime, [Stage] int, [Arg] int) 
; 

INSERT INTO TableName 
    ([ID], [IDShip], [Date], [Stage], [Arg]) 
VALUES 
    (1, 1, '2013-10-03 08:36:00', 0, Null), 
    (2, 1, '2013-10-03 08:37:25', 1, 1), 
    (3, 2, '2013-10-03 08:38:25', 0, Null), 
    (4, 1, '2013-10-03 08:39:25', 2, 1), 
    (5, 2, '2013-10-03 08:40:25', 1, 3) 
; 

( 「精氨酸」 是STAGE0的ID選擇*將:)

ID IDShip Date    Stage Arg 
1 1  2013-10-03 08:36:00  0 Null 
2 1  2013-10-03 08:37:25  1  1 
3 2  2013-10-03 08:38:25  0 Null 
4 1  2013-10-03 08:39:25  2  1 
5 2  2013-10-03 08:40:25  1  3 

成類似:

ID0 IDShip DateShipment   ID1 DateFirstStage  ID2 DateSecondStage 
1 1  2013-10-03 08:36:00 2 2013-10-03 08:37:25 4 2013-10-03 08:39:25  
3 2  2013-10-03 08:38:25 5 2013-10-03 08:40:25 

任何幫助?由於

+0

感謝您提供架構! –

回答

1

竟然是比我希望多一點混亂,但在這裏它是:

SELECT MAX([0]) AS ID0, 
    IDShip, 
    (SELECT [Date] FROM TableName T1 WHERE T1.ID = MAX([0]) AND T1.IDShip = Y.IDShip) AS DateShipment, 
    MAX([1]) AS ID1, 
    (SELECT [Date] FROM TableName T2 WHERE T2.ID = MAX([1]) AND T2.IDShip = Y.IDShip) AS DateFirstStage, 
    MAX([2]) AS ID2, 
    (SELECT [Date] FROM TableName T3 WHERE T3.ID = MAX([2]) AND T3.IDShip = Y.IDShip) AS DateSecondStage 
FROM 
    (SELECT * FROM TableName 
    PIVOT (MAX([ID]) FOR Stage IN ([0], [1], [2])) AS X) Y 
GROUP BY IDShip 

您第一樞軸表分爲3個階段的ID,然後選擇每個階段和它的日期。

0

看起來您需要同時轉換多個列。但是,標準的PIVOT語法不支持多列轉軸。您可以使用它來旋轉其中一列,然後使用它們作爲查找值,通過一系列相關子查詢來提取其他列值。

我採取的方法類似於@Szymon的,除非我設法避免在外部查詢中分組,但我在其他階段使事情更加混亂。這裏是我的嘗試:

SELECT 
    IDShip, 
    ID0, 
    ID1, 
    ID2, 
    DateShipment = (SELECT Date FROM TableName WHERE ID = p.ID0), 
    DateFirstStage = (SELECT Date FROM TableName WHERE ID = p.ID1), 
    DateSecondStage = (SELECT Date FROM TableName WHERE ID = p.ID2) 
FROM (
    SELECT 
    ID, 
    IDShip, 
    StageID = 'ID' + CAST(Stage AS varchar(10)) 
    FROM TableName 
) AS s 
PIVOT (
    MAX(ID) FOR StageID IN (ID0, ID1, ID2) 
) AS p 
; 

有了適當的索引,它可能不會太糟糕,但你也可以試試這個替代方案,它採用有條件聚集分組的舊​​的旋轉方法:

SELECT 
    IDShip, 
    ID0 = MAX(CASE Stage WHEN 0 THEN ID END), 
    ID1 = MAX(CASE Stage WHEN 1 THEN ID END), 
    ID2 = MAX(CASE Stage WHEN 2 THEN ID END), 
    DateShipment = MAX(CASE Stage WHEN 0 THEN Date END), 
    DateFirstStage = MAX(CASE Stage WHEN 1 THEN Date END), 
    DateSecondStage = MAX(CASE Stage WHEN 2 THEN Date END) 
FROM TableName 
GROUP BY IDShip 
; 

This SQL Fiddle demo將讓你嘗試這兩種解決方案。