MySQL 5.0下无需UNION/GROUP BY转换COUNT透视结果集
解决方案
针对MySQL 5.0版本,你可以通过将原聚合查询的结果与包含状态标签的派生表进行交叉连接,再用CASE语句匹配对应计数的方式,实现将列转换为行的需求,同时保证只扫描一次数据表(避免UNION带来的多次扫描开销)。
具体查询语句如下:
SELECT label AS '', CASE label WHEN 'not_assigned' THEN not_assigned WHEN 'assigned' THEN assigned END AS Count FROM ( SELECT COUNT(IF(b IS NULL, id, NULL)) AS not_assigned, COUNT(IF(b IS NOT NULL, id, NULL)) AS assigned FROM `table` WHERE OverType = 'abc' AND Type = 'def' AND Sub_Type = 'ghi' AND `Date` BETWEEN '2022-12-01' AND '2022-12-25' AND Client LIKE '%john%' ) AS aggregated_counts CROSS JOIN ( SELECT 'not_assigned' AS label UNION ALL SELECT 'assigned' AS label ) AS status_labels;
逻辑说明:
- 内层的
aggregated_counts子查询执行原有的过滤和聚合操作,只扫描一次数据表得到两个计数结果,效率与原查询一致。 status_labels派生表通过UNION ALL生成两个状态标签行,这部分仅处理固定的两行数据,无性能损耗。- 交叉连接(CROSS JOIN)将聚合结果与标签行组合,再通过CASE语句将每个标签映射到对应的计数,最终输出你需要的行式结构。
该方案既满足了格式转换需求,又保留了原查询的高效性,适合处理数百万行的大数据量场景。
内容的提问来源于stack exchange,提问作者Lilly_Co
相关产品推荐
相关产品推荐

