以下查询每个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
Run Code Online (Sandbox Code Playgroud)
我收到以下结果:
ID |TOT_COURSE_NUM |COUNT_GRAD |COUNT_UNDER
-------------------------------------------------
12345 |1 |1 |1
12345 |2 |2 |2
Run Code Online (Sandbox Code Playgroud)
有没有办法确保同一行中的grad和undergrad总数都计算在内?
您的直接问题是,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;
Run Code Online (Sandbox Code Playgroud)
count(<expression>)计算非NULL值的数量.你else '0'仍然是非空的,所以它被计算在内. sum()是一种处理这个问题的简单方法.
这个版本假设COURSE_IDENTIFICATION不是NULL.这似乎是一个名为的合理假设STUDENT_COURSE.它很容易修改以处理NULL值.
并且,select distinct几乎从不适合group by.