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

时间:2011-10-11 06:55:32

标签: 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   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 个答案:

答案 0 :(得分:1)

我的坏!透视需要实际值。我是盲目跟随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 ...