以下查询每个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
有什么方法可以确保将研究生和本科生的总数计入同一行?
答案 0 :(得分:5)
您的直接问题是course_level
在group 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
,它应该合并行。