【问题标题】:How do I convert rows to columns that resulted from a CTE?如何将行转换为 CTE 产生的列?
【发布时间】:2011-10-11 06:55:32
【问题描述】:

我有一个如下形式的 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

关于为什么会发生这种情况的任何建议?

【问题讨论】:

  • @Mitch Wheat:谢谢。我正在查看它,但我并不真正了解如何将它与 CTE 结合使用。目前正在尝试。如果我设法找到解决方案,将删除此问题。
  • @MitchWheat:发布了我的方法。虽然它返回预期的格式,但结果包含NULL 值,并且不确定为什么会发生这种情况。你有什么建议吗?

标签: sql sql-server sql-server-2008 common-table-expression


【解决方案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 ...

【讨论】:

  • 您可能不需要GROUP BY 的结果中的PIVOT/MAX。您可以直接执行PIVOT/SUM(或您在GROUP BY 中使用的任何聚合)。
猜你喜欢
  • 2019-11-20
  • 2021-12-29
  • 2012-02-08
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多