我有一个名为'候选人'的表,其中包含各个列中的score_math'和'score_language',反映候选人在相应测试中的得分。我需要
显示在数学和语言方面得分至少达到60分的学生人数(versatile_candidates)以及两名得分均低于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]请帮助
答案 0 :(得分:5)
你很接近 - 你获得所有候选人总数的原因是因为COUNT()
将0
计为与1
相同(以及任何其他非{}} 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
答案 1 :(得分:1)
COUNT()
未考虑NULL
值。将计算所有其他非NULL值。
您可能希望将其替换为SUM()