使用 Pivot 将行更改为列

Posted

技术标签:

【中文标题】使用 Pivot 将行更改为列【英文标题】:Using Pivot to change Rows into Columns 【发布时间】:2020-06-03 13:38:42 【问题描述】:

我正在重新发布此内容并添加其他信息。我正在处理 SQL 查询并使用 Pivot 并遇到问题。我在数据透视表中的列实际上显示为行数据,并为每个服务器重复。

WITH agg AS 
   (
    select NodeID, 
           count(distinct cpuindex) as number_of_cpu, 
           case 
               when count(distinct cpuindex) < 8 THEN 1
               else count(distinct cpuindex) / 8 
           end AS number_of_cores
    from CPUMultiLoad_Detail 
    where nodeid in (select nodeid from nodesdata)
    group by NodeID
   )
SELECT * FROM (
SELECT cp.Environment, n.Caption,
       cs.ComponentName,cs.ComponentStatisticData, cs.ErrorMessage,
       agg.NodeID, agg.number_of_cpu, agg.number_of_cores, n.description
FROM APM_CurrentStatistics cs 
INNER JOIN APM_Application app 
  ON cs.ApplicationID = app.ID
  AND app.Name IN ('Oracle Database Licensing') 
INNER JOIN NodesData n
  ON cs.NodeID = n.NodeID
  AND n.description NOT LIKE '%Windows%'
INNER JOIN NodesCustomProperties cp 
  ON cp.NodeID = n.NodeID
INNER JOIN agg
  ON cs.NodeID = agg.NodeID
) t
PIVOT(
   max(cs.ErrorMessage) FOR cs.ComponentName IN (
        [Oracle Version], 
        [Oracle Partitioning],
        [Oracle Tuning Pack], 
        [Diagnostic Pack], 
        [Real Application Clusters (RAC)]) 
) AS pivot_table;

期望的输出

我收到此错误 消息 107,第 15 级,状态 1,第 30 行 列前缀“cs”与查询中使用的表名或别名不匹配。 消息 107,第 15 级,状态 1,第 30 行 列前缀“cs”与查询中使用的表名或别名不匹配。

任何帮助将不胜感激。

【问题讨论】:

你用的是什么数据库?任何示例数据或 DDL 命令都会有所帮助。看起来您需要 max(ErrorMessage) FOR ComponentName 因为 cs 的范围仅在没有创建别名为表 t 的主查询之前。 【参考方案1】:

只要把这行的两个cs.去掉就行了

max(cs.ErrorMessage) FOR cs.ComponentName IN (

它将先前的选择语句视为已经运行,因此不需要消除这些列名的歧义

【讨论】:

非常感谢霍根。你真的让我很开心。 确定@SQLNovice——欢迎来到 SO。请记住通过单击此答案左侧的复选标记(或任何回答您问题的答案)将此问题标记为已回答。这将有助于网站更好地运行。

以上是关于使用 Pivot 将行更改为列的主要内容,如果未能解决你的问题,请参考以下文章

使用 pivot 和 in 子句将行转换为列

在 SQL 中将行更改为列

将某些行更改为列

SQL Server - Pivot 将行转换为列(带有额外的行数据)

使用 PIVOT 将行转换为列

使用 PIVOT/UNPIVOT 将行转换为列