【问题标题】:CASE statement still returning multiple rowsCASE 语句仍然返回多行
【发布时间】:2018-08-24 20:43:26
【问题描述】:

以下查询每个 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

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

【问题讨论】:

  • 是的,很简单:从GROUP BY 中删除course_level
  • 您也可以从您的选择中删除DISTINCT 关键字。它没有伤害任何东西,但 GROUP BY 已经返回不同的结果。
  • 那是一个case 表达式,而不是一个语句

标签: sql oracle case


【解决方案1】:

您的直接问题是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

【讨论】:

  • 关注ELSE 0
  • 关注else '0'。但是,您隐式编写的 then 部分并不等同于 OP 编写的内容。如果course_identification 可以为null,则OP 的代码不会计算它;你的意愿。
  • @mathguy 。 . .我知道。我只是没有解释。我添加了一个解释。
  • “我知道”不等于“我想到了”;但无论如何,如果你不写出来,你所知道的对任何阅读你的答案的人都没有帮助。
【解决方案2】:

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

【讨论】:

  • @Lyndey 。 . .具有讽刺意味的是,这是公认的答案,但在实施时实际上并没有返回您想要的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
相关资源
最近更新 更多