如何在MySQL分组查询中为3个COUNT列添加列总计
实现分组统计+列总计的SQL方案
嘿,我明白你的需求啦——既要保留每个分组的统计数据,又要在结果末尾加上每列的全局总计行对吧?这可以通过UNION ALL把分组统计和总计统计的结果拼接起来实现,下面是具体的方案:
完整SQL代码
-- 先查询各分组的统计数据 SELECT COUNT(DISTINCT od.`meter_serial`) AS 'OGP Created', COUNT(DISTINCT mp.`meter_id`) AS 'Installed & Un-Verified Meters', COUNT(DISTINCT ins.`meter_msn`) AS 'Installed & Verified', sd.`sub_div_code` AS 'SD Code', sd.`name` AS 'SD-Name', 1 AS sort_order -- 辅助排序,让分组数据排在前面 FROM `ogp_detail` od INNER JOIN `survey_hesco_subdivision` sd ON od.`sub_div` = sd.`sub_div_code` LEFT JOIN `meter_ping` mp ON od.`meter_id` = mp.`meter_id` LEFT JOIN `installations` ins ON od.`meter_serial` = ins.`meter_msn` WHERE od.`meter_type` = '3-Phase' GROUP BY sd.`name`, sd.`sub_div_code` UNION ALL -- 再查询全局总计数据 SELECT COUNT(DISTINCT od.`meter_serial`) AS 'OGP Created', COUNT(DISTINCT mp.`meter_id`) AS 'Installed & Un-Verified Meters', COUNT(DISTINCT ins.`meter_msn`) AS 'Installed & Verified', '总计' AS 'SD Code', '总计' AS 'SD-Name', 2 AS sort_order -- 辅助排序,让总计行排在最后 FROM `ogp_detail` od INNER JOIN `survey_hesco_subdivision` sd ON od.`sub_div` = sd.`sub_div_code` LEFT JOIN `meter_ping` mp ON od.`meter_id` = mp.`meter_id` LEFT JOIN `installations` ins ON od.`meter_serial` = ins.`meter_msn` WHERE od.`meter_type` = '3-Phase' ORDER BY sort_order, sd.`name`; -- 先按sort_order排序,再按分组名称排序
关键说明
UNION ALL的作用:它能把两个查询的结果合并成一个结果集,而且不会像UNION那样去重,效率更高,完全符合我们保留分组+总计的需求。- 辅助排序字段
sort_order:加这个字段是为了确保总计行始终显示在所有分组数据的最后,避免排序混乱。 - 总计行的统计逻辑:这里的总计是直接计算全局范围内的三个统计值,和分组统计的逻辑一致,保证数据准确性。
如果你希望总计行的样式更突出(比如用不同的标识),可以把'总计'改成'====总计===='这类更醒目的文本,方便区分。
内容的提问来源于stack exchange,提问作者Moeez
相关产品推荐
相关产品推荐

