MySQL透视表(交叉表)生成结果不符,求正确实现方案
修正后的MySQL透视表SQL
原SQL仅对每行数据做列拆分,未处理同一机器类型下同优先级的多行问题,导致结果无法对齐成目标表格格式。要实现预期交叉表,需先给每个机器类型+优先级的问题组分配行号,再按行号分组聚合,将对应行的各优先级问题整合到同一行。
修正后的SQL语句:
SELECT machtype AS `Mach Name`, MAX(CASE WHEN priors = '5' THEN problems ELSE NULL END) AS `5`, MAX(CASE WHEN priors = '4' THEN problems ELSE NULL END) AS `4`, MAX(CASE WHEN priors = '3' THEN problems ELSE NULL END) AS `3`, MAX(CASE WHEN priors = '2' THEN problems ELSE NULL END) AS `2`, MAX(CASE WHEN priors = '1' THEN problems ELSE NULL END) AS `1` FROM ( SELECT machtype, priors, problems, ROW_NUMBER() OVER (PARTITION BY machtype, priors ORDER BY problems) AS rn FROM priority ) AS sub GROUP BY machtype, rn ORDER BY machtype, rn;
核心逻辑说明:
- 子查询通过
ROW_NUMBER() OVER (PARTITION BY machtype, priors ORDER BY problems),为每个机器类型下的同优先级问题分配行号,确保同一优先级的多个问题能按顺序对应到不同行。 - 外层查询按机器类型和行号分组,用
MAX()聚合函数提取对应行号、对应优先级的问题——同一分组内每个优先级列仅存在一个非空值,MAX会自动取该值,空值则保留为NULL。 - 最终结果按机器类型和行号排序,与目标表格结构完全匹配。
内容的提问来源于stack exchange,提问作者mest2humb
相关产品推荐
相关产品推荐

