CASE语句仍返回多行

时间:2018-08-24 20:43:26

标签: sql oracle case

以下查询每个ID返回两行。

select distinct ID,
count (COURSE_IDENTIFICATION) as tot_course_id,

COUNT(case when course_level = 'G'
     then (COURSE_IDENTIFICATION)
     else '0'end) count_grad,

COUNT (case when course_level = 'U'
       then (COURSE_IDENTIFICATION)
       else '0'end) count_under

from ods.STUDENT_COURSE

where ACADEMIC_PERIOD = '201890'
and COURSE_BILLING_CREDITS >0.0
group by ID, course_level
order by 1

我收到以下结果:

ID      |TOT_COURSE_NUM |COUNT_GRAD |COUNT_UNDER
-------------------------------------------------
12345   |1              |1          |1
12345   |2              |2          |2

有什么方法可以确保将研究生和本科生的总数计入同一行?

2 个答案:

答案 0 :(得分:5)

您的直接问题是course_levelgroup by中。第二个问题是count()不正确。我认为这应该足够了:

select ID,
       count(*) as tot_course_id,
       sum(case when course_level = 'G' then 1 else 0 end) as count_grad,
       sum(case when course_level = 'U' then 1 else 0 end) as count_under
from ods.STUDENT_COURSE sc
where ACADEMIC_PERIOD = '201890' and
      COURSE_BILLING_CREDITS > 0.0
group by ID
order by 1;

count(<expression>)计算非NULL值的数量。您的else '0'仍为非空,因此将被计算在内。 sum()是解决此问题的简单方法。

此版本假定COURSE_IDENTIFICATION不是NULL。在名为STUDENT_COURSE的表中,这似乎是一个合理的假设。可以轻松修改它以处理NULL值。

而且,select distinct几乎永远不适用于group by

答案 1 :(得分:4)

在group by语句中,您指定subchart1。从您的group by语句中删除course_level,它应该合并行。