与case条件语句的求和如何在sql中工作

时间:2015-03-29 23:56:50

标签: oracle conditional aggregate-functions

前几天,我回答了this问题但是其他用户用sum + case条件语句解决了这个问题,在结果中添加了一个边缘条件。所以,我想到了这个问题,以下查询中的语句sum(case when jobname = 'Analyst' then 1 else 0 end)如何工作

select d.*
from (select deptno,
         sum(case when jobname = 'Analyst' then 1 else 0 end) as numAnalysts
      from employees
      group by deptno
      order by numAnalysts asc
     ) d
where rownum = 1;`

并返回部门的员工人数。另外,我想了解此查询的性能。

在发布此问题之前,我会先阅读thisthisthis,但仍然无法了解其效果。

2 个答案:

答案 0 :(得分:5)

据推测,这是你正在努力理解的部分:

  select deptno,
         sum(case when jobname = 'Analyst' then 1 else 0 end) as numAnalysts
  from employees
  group by deptno

这是一个简单的聚合查询。查询的作用是:

  • 查看employees
  • 中的每一行
  • 如果jobname'Analyst',则指定1的值(这是case语句. Otherwise, assign a value of 0`。
  • 按部门汇总,汇总刚刚计算的值。这具有计算分析员数量的效果。

case是一个返回值的表达式。 sum()只是为每个组添加该值。

答案 1 :(得分:1)

让我们尝试将问题分成两部分。

首先,假设您想要一个字段,说明作业名称是'分析师'或不。

SELECT
  deptno,
  CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END AS IsAnalyst
FROM
  employees

对于没有'分析师'的所有作业名,此查询将返回0。和所有那些分析师'

此时你会有类似的东西

deptno IsAnalyst
1      1
1      0
1      0
2      0
2      1
2      1
2      1
2      0

其次, 您希望按部门汇总此信息

SELECT
  deptno,
  SUM(CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END) AS numAnalysts
FROM
  employees
GROUP BY
  deptno

您正在通过deptno对所有这些值和分组应用一笔金额。

此时(我从查询中删除order by以简化它)您将获得以下输出

deptno numAnalysts
1      1
2      3

我认为这个例子胜过千言万语

希望这有帮助