Оператор CASE по-прежнему возвращает несколько строк - PullRequest
0 голосов
/ 24 августа 2018

следующий запрос возвращает две строки для каждого идентификатора.

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 голосов
/ 24 августа 2018

Ваша непосредственная проблема в том, что 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.

0 голосов
/ 24 августа 2018

В вашей группе по заявке вы указываете course_level. Удалите course_level из вашей группы по заявке, и она должна объединить строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...