Sql 如何将CTE生成的行转换为列?
我有以下形式的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
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
(或您在组中使用的任何聚合)。