带有条件条件语句的总和在SQL中如何工作

cod*_*hki 2 oracle conditional aggregate-functions

前几天,我给了这个问题一个答案,但随后其他用户使用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;`
Run Code Online (Sandbox Code Playgroud)

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

在发布此问题之前,我阅读了thisthisthis,但仍然不知道其工作原理。

Gor*_*off 6

大概这是您要努力理解的部分:

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

确实,这是一个简单的聚合查询。查询正在做的是:

  • 看看其中的每一行 employees
  • 如果jobname为,'Analyst'则分配的值1(这是case语句. Otherwise, assign a value of0`。
  • 按部门汇总,将刚刚计算出的值相加。这具有计算分析师人数的作用。

case是一个返回值的表达式。的sum()是简单地增加了每个组的值。


CrA*_*HeR 6

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

首先,假设您想要一个字段来说明职位名称是否为“分析师”。

SELECT
  deptno,
  CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END AS IsAnalyst
FROM
  employees
Run Code Online (Sandbox Code Playgroud)

对于所有非“Analyst”的作业名称,此查询将返回 0;对于所有“Analyst”的作业名称,该查询将返回 1

此时你会得到类似这样的东西

deptno IsAnalyst
1      1
1      0
1      0
2      0
2      1
2      1
2      1
2      0
Run Code Online (Sandbox Code Playgroud)

其次,您想按部门汇总这些信息

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

您将对所有这些值应用总和并按 deptno 进行分组。

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

deptno numAnalysts
1      1
2      3
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助