如何编写SQL统计各公司已完成项目数(避免多余分组)
统计每家公司已完成项目数的正确SQL写法
方法1:条件聚合(推荐,兼容所有主流数据库)
直接在计数时添加状态判断,不需要把status加入分组:
SELECT a.company_id, COUNT(CASE WHEN b.status = 'completed' THEN b.project_id END) AS completed_project_count FROM a LEFT JOIN b ON a.company_id = b.company_id GROUP BY a.company_id
用LEFT JOIN是为了让没有任何项目的公司也能出现在结果里,完成数显示0;如果只需要有已完成项目的公司,换成JOIN即可。
方法2:关联子查询
把统计逻辑封装在子查询里,直接和公司表关联:
SELECT a.company_id, COALESCE( (SELECT COUNT(project_id) FROM b WHERE b.company_id = a.company_id AND b.status = 'completed'), 0 ) AS completed_project_count FROM a
COALESCE用来处理子查询返回NULL的情况,把它转成0,确保所有公司都有数值结果。
方法3:先过滤再关联
先从项目表中筛出已完成的记录,再和公司表关联统计:
SELECT a.company_id, COUNT(b_filtered.project_id) AS completed_project_count FROM a JOIN ( SELECT company_id, project_id FROM b WHERE status = 'completed' ) AS b_filtered ON a.company_id = b_filtered.company_id GROUP BY a.company_id
这个写法适合只需要统计有已完成项目的公司场景。
内容的提问来源于stack exchange,提问作者DomDom23
相关产品推荐
相关产品推荐

