如何编写按部门统计passed状态占比的SQL查询语句
解决方案
你可以通过按部门分组+条件聚合的方式,一次性统计所有部门的passed占比,同时生成你需要的格式化文本结果。以下是两种可行的SQL写法:
方法1:条件聚合(推荐,更简洁)
SELECT department, -- 生成类似 "Finance: passed 66.67%" 的格式化文本 CONCAT(department, ': passed ', ROUND(SUM(CASE WHEN status = 'passed' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2), '%') AS status_summary, -- 单独输出百分比数值(方便Grafana做可视化,比如条形图) ROUND(SUM(CASE WHEN status = 'passed' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS passed_percent FROM your_table_name GROUP BY department ORDER BY department;
逻辑说明:
SUM(CASE WHEN status = 'passed' THEN 1 ELSE 0 END):统计每个部门中status为passed的人数COUNT(*):统计每个部门的总人数ROUND(..., 2):控制百分比的小数位数(这里保留2位,可按需调整)GROUP BY department:确保按部门分组计算,一次性输出所有部门的结果
方法2:基于窗口函数的写法(和你原有查询逻辑衔接)
如果你想沿用窗口函数的思路,可以用子查询先计算各部门的状态明细和总人数,再外层汇总:
SELECT DISTINCT department, CONCAT(department, ': passed ', ROUND(MAX(CASE WHEN status = 'passed' THEN cnt * 100.0 / total END), 2), '%') AS status_summary, ROUND(MAX(CASE WHEN status = 'passed' THEN cnt * 100.0 / total END), 2) AS passed_percent FROM ( SELECT department, status, COUNT(*) AS cnt, -- 窗口函数计算当前部门的总人数 SUM(COUNT(*)) OVER (PARTITION BY department) AS total FROM your_table_name GROUP BY department, status ) t GROUP BY department ORDER BY department;
适配Grafana的建议:
- 如果用表格面板展示:
department和status_summary列可以直接显示文本结果 - 如果做可视化(比如条形图):用
department作为X轴,passed_percent作为Y轴,能直观对比各部门的通过率
注意:请将上述SQL中的your_table_name替换成你实际的表名。
内容的提问来源于stack exchange,提问作者amon
相关产品推荐
相关产品推荐

