如何将两个不同统计条件的SQL Count查询合并为单条查询?
完全可以通过单条SQL实现,核心采用条件聚合方案即可,仅需一次表扫描就能得到两个维度的统计结果,性能优于两次查询再关联的写法。
通用兼容全数据库写法
该写法支持MySQL、PostgreSQL、SQL Server、Oracle等所有主流关系型数据库:
SELECT a.EmployeeId, COUNT(CASE WHEN a.jobstatusid <> 5 THEN a.JobStatusId END) AS cTotOut, COUNT(CASE WHEN a.jobstatusid = 5 THEN a.JobStatusId END) AS cTotHis FROM ActivityRecord a GROUP BY a.EmployeeId
原理解释:
COUNT函数统计时会自动忽略NULL值,CASE WHEN语句不符合判断条件时默认返回NULL,因此刚好可以精准统计对应条件的记录总数。
特定数据库简化写法
如果是MySQL环境,可以用IF函数简化语法:
SELECT a.EmployeeId, SUM(IF(a.jobstatusid <> 5, 1, 0)) AS cTotOut, SUM(IF(a.jobstatusid = 5, 1, 0)) AS cTotHis FROM ActivityRecord a GROUP BY a.EmployeeId
扩展场景:展示所有员工(含无作业记录的员工)
如果需要输出所有员工的统计结果,哪怕该员工没有任何ActivityRecord记录,两个统计字段显示为0,可以左关联员工主表实现:
SELECT e.EmployeeId, COUNT(CASE WHEN a.jobstatusid <> 5 THEN a.JobStatusId END) AS cTotOut, COUNT(CASE WHEN a.jobstatusid = 5 THEN a.JobStatusId END) AS cTotHis FROM Employee e LEFT JOIN ActivityRecord a ON e.EmployeeId = a.EmployeeId GROUP BY e.EmployeeId
内容的提问来源于stack exchange,提问作者Haminteu
相关产品推荐
相关产品推荐

