如何修改SQL查询以统计vicidial_list表指定STATUS状态的总计数
SQL查询修改方案
你可以通过新增STATUS过滤条件 + 分组汇总语法实现需求,两种常见写法如下:
写法一(推荐,WITH ROLLUP 简洁写法)
针对MySQL环境(vicidial默认使用MySQL)可以直接用ROLLUP语法自动生成汇总行:
SELECT IFNULL(STATUS, '总计数') AS STATUS, COUNT(*) AS 计数 FROM vicidial_list WHERE list_id BETWEEN 2732900 AND 2732905 AND STATUS IN ('A', 'AA', 'B', 'DROP', 'N', 'NA', 'NC', 'PDROP') GROUP BY 1 WITH ROLLUP ORDER BY -- 控制总计数排在所有状态明细的最后 CASE WHEN STATUS IS NULL THEN 1 ELSE 0 END, STATUS
写法二(通用UNION ALL写法,兼容所有SQL数据库)
如果所用数据库不支持ROLLUP,可以用UNION ALL拼接明细和汇总结果:
-- 查询各指定STATUS的计数 SELECT STATUS, COUNT(*) AS 计数 FROM vicidial_list WHERE list_id BETWEEN 2732900 AND 2732905 AND STATUS IN ('A', 'AA', 'B', 'DROP', 'N', 'NA', 'NC', 'PDROP') GROUP BY STATUS UNION ALL -- 查询所有指定STATUS的总计数 SELECT '总计数' AS STATUS, COUNT(*) AS 计数 FROM vicidial_list WHERE list_id BETWEEN 2732900 AND 2732905 AND STATUS IN ('A', 'AA', 'B', 'DROP', 'N', 'NA', 'NC', 'PDROP') ORDER BY CASE WHEN STATUS = '总计数' THEN 1 ELSE 0 END, STATUS
两种写法返回的结果都会先展示你指定的8个STATUS的各自计数,最后一行显示所有符合条件记录的总计数,和你预期的1908一致。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

