2014-04-14 2 views
0

Я хотел бы получить PIVOT следующий результат запроса, чтобы отобразить столбец для каждого кода состояния проекта.Ошибки синтаксиса разворота TSQL

WITH r AS (
    SELECT ROW_NUMBER() OVER (ORDER BY ph.InsertedDateTime) rownum, 
     CAST(ph.InsertedDateTime AS DATE) InsertedDate, ph.Gate_1_TargetDate, ph.Gate_2_TargetDate, ph.Gate_3_TargetDate 
    FROM PROJECT_HIST ph 
    JOIN (
     SELECT ProjectID, MAX(InsertedDateTime) InsertedDateTime 
     FROM PROJECT_HIST 
     GROUP BY ProjectID, CAST(InsertedDateTime AS DATE) 
    ) ph_distinct_date ON ph_distinct_date.InsertedDateTime = ph.InsertedDateTime 
     AND ph_distinct_date.ProjectID = ph.ProjectID 
    WHERE ph.projectid = 100957 
     AND NOT (
      ph.Gate_1_TargetDate IS NULL 
       AND ph.Gate_2_TargetDate IS NULL 
       AND ph.Gate_3_TargetDate IS NULL 
     ) 
), 
fubar AS (
    SELECT rownum, InsertedDate, 0 gateName, NULL targetDate FROM r 
    UNION ALL 
    SELECT rownum, InsertedDate, 1, Gate_1_TargetDate FROM r 
    UNION ALL 
    SELECT rownum, InsertedDate, 2, Gate_2_TargetDate FROM r 
    UNION ALL 
    SELECT rownum, InsertedDate, 3, Gate_3_TargetDate FROM r 
) 
SELECT f1.InsertedDate 'Change Date', f1.gateName 'ProjectStageCode', f1.targetDate 
FROM fubar f1 
LEFT JOIN fubar f2 ON f2.rownum = f1.rownum - 1 
    AND f2.gateName = f1.gateName 
PIVOT(min(f1.InsertedDate) FOR f1.gateName IN ([0],[1],[2],[3])) AS p 
WHERE f1.rownum = 1 
    OR f1.targetDate <> f2.targetDate 
ORDER BY f1.InsertedDate 
; 

Pivot errors

Без попытки поворота, этот запрос в настоящее время возвращает этот результат для данного конкретного проекта:

enter image description here

То, что я хотел бы сделать, это повернуть запрос для создания столбцов для каждого кода этапа проекта в соответствии со следующим результатом:

enter image description here

По существу, мне нужно иметь строку для каждого уникального Change Date и имеют значение targetDate колонки заполнения в соответствующем вновь повернутом численном ProjectStageCode колонке.

ответ

1

Из-за внешнего вида кажется, что вам просто нужно использовать подзапрос, прежде чем пытаться выполнить PIVOT. Вам также необходимо заполнить targetDate вместо InsertedDate:

WITH r AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY ph.InsertedDateTime) rownum, 
     CAST(ph.InsertedDateTime AS DATE) InsertedDate, ph.Gate_1_TargetDate, ph.Gate_2_TargetDate, ph.Gate_3_TargetDate 
    FROM PROJECT_HIST ph 
    JOIN 
    (
     SELECT ProjectID, MAX(InsertedDateTime) InsertedDateTime 
     FROM PROJECT_HIST 
     GROUP BY ProjectID, CAST(InsertedDateTime AS DATE) 
    ) ph_distinct_date 
     ON ph_distinct_date.InsertedDateTime = ph.InsertedDateTime 
     AND ph_distinct_date.ProjectID = ph.ProjectID 
    WHERE ph.projectid = 100957 
     AND NOT (ph.Gate_1_TargetDate IS NULL 
        AND ph.Gate_2_TargetDate IS NULL 
        AND ph.Gate_3_TargetDate IS NULL) 
), 
fubar AS 
(
    SELECT rownum, InsertedDate, 0 gateName, NULL targetDate FROM r 
    UNION ALL 
    SELECT rownum, InsertedDate, 1, Gate_1_TargetDate FROM r 
    UNION ALL 
    SELECT rownum, InsertedDate, 2, Gate_2_TargetDate FROM r 
    UNION ALL 
    SELECT rownum, InsertedDate, 3, Gate_3_TargetDate FROM r 
) 
SELECT ChangeDate, [0],[1],[2],[3] 
FROM 
(
    SELECT f1.InsertedDate ChangeDate, f1.gateName, f1.targetDate 
    FROM fubar f1 
    LEFT JOIN fubar f2 
     ON f2.rownum = f1.rownum - 1 
     AND f2.gateName = f1.gateName 
    WHERE f1.rownum = 1 
     OR f1.targetDate <> f2.targetDate 
) d 
PIVOT 
(
    min(targetDate) 
    FOR gateName IN ([0],[1],[2],[3]) 
) AS p; 
Смежные вопросы