Как преобразовать строки в столбцы, полученные в результате CTE? - PullRequest
3 голосов
/ 11 октября 2011

У меня есть выражение CTE следующей формы:

WITH nCTE AS
(
   SELECT *
   FROM 
   TableA X INNER JOIN TableB Y
   ON X.ID = Y.ID
)
SELECT *
FROM
(
   SELECT ...
   FROM nCTE
)
WHERE ...
GROUP BY ...
ORDER BY ...

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

ID   Name   Badge   Type   Value
1   John    Blue    Pre    10
1   John    Blue    Post   20
1   John    Blue    Cur    30
1   John    Green   Pre    50
1   John    Green   Post   30
1   John    Green   Cur    20

Я пытаюсь получить результаты вследующая форма:

ID   Name   Badge   Pre   Cur   Post
1    John   Blue    10    20    30
2    John   Green   50    30    20

Поскольку я использую CTE, я не уверен, могу ли я сделать это прямым способом, или я должен сам объединить результаты несколько раз, чтобы получить это (это простовсе выглядит долго, некрасиво и сложно).Есть ли хороший способ добиться этого?

ОБНОВЛЕНИЕ: Попытка этого возвращает значение NULL

WITH nCTE AS
(
   SELECT *
   FROM 
   TableA X INNER JOIN TableB Y
   ON X.ID = Y.ID
)
SELECT ID, Name, Badge, [0] AS 'Pre', [1] AS 'Cur', [2] AS 'Post'
FROM
(
    SELECT *
    FROM
    (
       SELECT ...
       FROM nCTE
    )
    WHERE ...
    GROUP BY ...
) Y
PIVOT
(
   MAX(Value)
   FOR Type IN ([0], [1], [2])
) AS PivotTable
ORDER BY ...

Пока работает сам запрос, он возвращает следующее:

ID   Name   Badge   Pre     Cur     Post
1    John   Blue    NULL    NULL    NULL
2    John   Green   NULL    NULL    NULL

Есть какие-нибудь предложения относительно того, почему это происходит?

1 Ответ

1 голос
/ 11 октября 2011

Мой плохой! Поворот требовал фактических значений. Я слепо следовал примеру MSDN. В любом случае работает следующее:

WITH nCTE AS
(
   SELECT *
   FROM 
   TableA X INNER JOIN TableB Y
   ON X.ID = Y.ID
)
SELECT ID, Name, Badge, [Pre] AS 'Pre', [Cur] AS 'Cur', [Post] AS 'Post'
FROM
(
    SELECT *
    FROM
    (
       SELECT ...
       FROM nCTE
    )
    WHERE ...
    GROUP BY ...
) Y
PIVOT
(
   MAX(Value)
   FOR Type IN ([Pre], [Cur], [Post])
) AS PivotTable
ORDER BY ...
...