2013-10-03 2 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) 
; 

("의 Arg는"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 's와 비슷했지만 다른 단계에서는 더 복잡했습니다.

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 
; 

: 당신은 또한 조건부 집계로 그룹화 이전 회전 기술을 사용이 대안을 시도 할 수 있지만

적절한 색인으로
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 
; 

, 그것은 너무 나쁘지 않을 수 있습니다 : 여기 내 시도 This SQL Fiddle demo을 사용하면 두 가지 솔루션을 모두 사용할 수 있습니다.