如何实现SQL统计从未出席任何活动的人员总数?
统计从未出席活动的人员总数
问题背景
现有存储人员活动出席状态的表,数据如下:
| 人员 | 活动状态 |
|---|---|
| Ethan Williams | NoShow |
| Ethan Williams | NoShow |
| Olivia Rodriguez | Arrived |
| Olivia Rodriguez | NoShow |
| Olivia Rodriguez | NoShow |
| Benjamin Chen | Arrived |
| Benjamin Chen | NoShow |
| Isabella Gomez | NoShow |
需求是统计**从未出席任何活动(所有记录均为NoShow)**的人员总数,预期结果为2(Ethan Williams和Isabella Gomez)。原代码仅能列出符合条件的人员,无法直接统计数量。
原代码问题分析
原代码使用COUNT(DISTINCT CASE...)做差值判断,逻辑冗余且绕远路——我们只需要判断某人员是否从未出现过Arrived状态即可,不需要计算两种状态的去重计数差值。
解决方案
以下两种写法都能直接得到目标总数:
方法1:分组筛选后统计(兼容性强)
先分组筛选出所有状态均为NoShow的人员,再统计这些人员的数量:
SELECT COUNT(*) AS NeverAttendedCount FROM ( SELECT "Person" FROM TABLE GROUP BY "Person" -- 核心判断:该人员的活动记录中,Arrived状态的数量为0 HAVING SUM(CASE WHEN EventStatus = 'Arrived' THEN 1 ELSE 0 END) = 0 ) AS FilteredPersons
方法2:排除有过出席记录的人员(更简洁)
先找出所有有过Arrived记录的人员,再统计不在这个集合里的人员数量:
SELECT COUNT(DISTINCT "Person") AS NeverAttendedCount FROM TABLE WHERE "Person" NOT IN ( SELECT DISTINCT "Person" FROM TABLE WHERE EventStatus = 'Arrived' )
说明
两种方法都能返回预期结果2,其中方法1的分组判断逻辑更直观,适合需要同时查看人员名单的场景;方法2的子查询逻辑更简洁,适合仅需要统计数量的场景。
内容的提问来源于stack exchange,提问作者Nshalev
相关产品推荐
相关产品推荐

