SQL的情况问题

时间:2017-01-06 19:54:50

标签: sql postgresql case

我有一个名为'候选人'的表,其中包含各个列中的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]请帮助

2 个答案:

答案 0 :(得分:5)

你很接近 - 你获得所有候选人总数的原因是因为COUNT()0计为与1相同(以及任何其他非{}} NULL值,就此而言)。由于价值只能是01,因此您的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()