我有一个名为"候选人"的表格,其中包含score_math"和"score_language"列,反映了候选人在各自测试中的分数。我需要
显示数学和语言 (versatile_candidates) 得分至少为 60 的学生人数,以及两者得分均低于 40 的学生人数 这些测试(poor_candidates)。不要包括具有 NULL preferred_contact 的学生。我的查询是:
select
count(case when score_math>=60 and score_language>=60 then 1 else 0
end) as versatile_candidates,
count(case when score_math<40 and score_language<40 then 1 else 0 end) as
poor_candidates
from candidate
where preferred_contact is not null
但这始终会产生具有非空首选联系人类型的候选人总数。无法真正弄清楚我做错了什么,更重要的是为什么这不起作用。[如果这很重要,DBMS 是 Postgres]请帮忙
你很接近 - 你得到所有候选人总数的原因是COUNT()
将计算与1
相同的0
(以及任何其他非NULL
值,就此而言)。 由于这些值只能是0
或1
,因此您的COUNT()
将返回所有候选项的总数。
由于您已经默认了与0
不匹配的情况,您需要做的就是将COUNT()
更改为SUM()
:
Select Sum(Case When score_math >= 60
And score_language >= 60 Then 1
Else 0
End) As versatile_candidates
, Sum(Case When score_math < 40
And score_language < 40 Then 1
Else 0
End) As poor_candidates
From candidate
Where preferred_contact Is Not Null
COUNT()
不考虑NULL
值。所有其他非 NULL 的值都将被计算在内。
您可能希望将其替换为SUM()