使用 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 将行更改为列的主要内容,如果未能解决你的问题,请参考以下文章