Sql 如何将CTE生成的行转换为列?

Sql 如何将CTE生成的行转换为列?,sql,sql-server,sql-server-2008,common-table-expression,Sql,Sql Server,Sql Server 2008,Common Table Expression,我有以下形式的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 Pre Cur Post 1 John Blue 10 20

我有以下形式的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   Pre   Cur   Post
1    John   Blue    10    20    30
2    John   Green   50    30    20
此查询的结果如下所示:

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
我试图以以下形式获得结果:

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   Pre   Cur   Post
1    John   Blue    10    20    30
2    John   Green   50    30    20
当我使用CTE时,我不确定我是否可以直接这样做,或者我应该多次自我加入结果以获得这个结果(这只会让一切看起来冗长、丑陋和复杂)。有没有一个好的方法来实现这一点

更新:尝试此操作将返回空值

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

关于为什么会发生这种情况有什么建议吗?

我的错!旋转需要实际值。我盲目地追随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 ...

@米奇·麦特:谢谢。我正在查看它,但并不真正了解如何将其与CTE结合使用。我正在尝试。如果我能找到解决方案,我将删除这个问题。@Mitchheat:发布了我的方法。虽然它返回预期的格式,但是结果包含
NULL
值,并且不确定发生这种情况的原因。您有什么建议吗?您可能不需要使用
分组结果中的
透视
/
最大值
。您可能可以直接执行
PIVOT
/
SUM
(或您在
组中使用的任何聚合)。