如何编写SQL语句实现符合预期的分组计数查询?
修正后的SQL语句
要实现「同一ID下的同一StuId,若存在IsDone=true的记录,则忽略该StuId的所有记录」的统计需求,可使用以下两种方案:
方案1:用NOT EXISTS排除不符合条件的StuId
SELECT ID, COUNT(DISTINCT StuId) AS Count FROM Student s_main WHERE NOT EXISTS ( SELECT 1 FROM Student s_sub WHERE s_sub.ID = s_main.ID AND s_sub.StuId = s_main.StuId AND s_sub.IsDone = true ) GROUP BY ID;
方案2:先分组筛选再统计
SELECT ID, COUNT(StuId) AS Count FROM ( SELECT ID, StuId FROM Student GROUP BY ID, StuId -- 筛选出该ID+StuId下无IsDone=true记录的分组 HAVING SUM(CASE WHEN IsDone = true THEN 1 ELSE 0 END) = 0 ) valid_stus GROUP BY ID;
原SQL的问题分析
你的原SQL仅筛选了IsDone=false的记录并去重,但未排除「同一ID+StuId下存在IsDone=true」的StuId。比如ID=11111的q-01、q-02,虽然有IsDone=false的记录,但按照规则应被完全排除,可原SQL仍将它们纳入统计,导致结果不符合预期。另外你提到实际结果为11111=1,这大概率是执行的SQL与你提供的代码不一致(比如误将IsDone=false写成IsDone=true),按你给出的原SQL,理论上会得到11111=4的结果。
内容的提问来源于stack exchange,提问作者thitidev
相关产品推荐
相关产品推荐

