sum with case 条件语句如何在 sql 中工作

How sum with case conditional statement works in sql

前几天,我回答了 问题,但后来其他用户使用 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;`

和return一个部门的员工人数。另外,我想了解一下这个查询的性能。

在发布这个问题之前,我阅读了 this, this and this 但仍然不明白它是如何工作的。

据推测,这是您难以理解的部分:

  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 of0`。
  • 按部门汇总,将刚刚计算的值相加。这个有统计分析师人数的效果。

case是一个表达式,表示returns一个值。 sum() 只是将每个组的值相加。

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

首先,假设您想要一个字段说明作业名称是否为 'Analyst'。

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

此查询将为所有非 'Analyst' 的作业名称 return 0,对于所有 'Analyst'

的作业名称为 1

此时你会得到这样的东西

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

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

希望对您有所帮助