Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle sum with case条件语句在sql中的工作原理_Oracle_Conditional_Aggregate Functions - Fatal编程技术网

Oracle sum with case条件语句在sql中的工作原理

Oracle sum with case条件语句在sql中的工作原理,oracle,conditional,aggregate-functions,Oracle,Conditional,Aggregate Functions,前几天,我回答了这个问题,但另一个用户用sum+case条件语句解决了这个问题,在结果中添加了一个边缘条件。因此,我想到了一个问题,下面查询中的语句sum(当jobname='Analyst'然后是1 else 0 end时)是如何工作的 select d.* from (select deptno, sum(case when jobname = 'Analyst' then 1 else 0 end) as numAnalysts from employees

前几天,我回答了这个问题,但另一个用户用sum+case条件语句解决了这个问题,在结果中添加了一个边缘条件。因此,我想到了一个问题,下面查询中的语句
sum(当jobname='Analyst'然后是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;`
并返回一个部门的员工人数。另外,我想了解这个查询的性能


在发布这个问题之前,我读了一遍,但仍然不知道它是如何工作的。

大概,这是您正在努力理解的部分:

  select deptno,
         sum(case when jobname = 'Analyst' then 1 else 0 end) as numAnalysts
  from employees
  group by deptno
实际上,这是一个简单的聚合查询。查询所做的是:

  • 查看
    employees
  • 如果
    jobname
    'Analyst'
    ,则分配
    1
    的值(这是
    案例
    语句
    。否则,分配值
    0`
  • 按部门汇总,将刚刚计算的值相加。这具有计算分析师人数的效果

case
是一个返回值的表达式。
sum()
只是将每个组的值相加。

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

首先,假设您需要一个字段来说明jobname是否为“Analyst”

SELECT
  deptno,
  CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END AS IsAnalyst
FROM
  employees
此查询将为所有不为“Analyst”的jobname返回0,为所有为“Analyst”的jobname返回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进行分组

此时(为了简化查询,我从查询中删除了
orderby
),您将得到以下输出

deptno numAnalysts
1      1
2      3
我认为一个例子胜过千言万语


希望这有助于

理解查询性能的第一步是在查询中使用explain..至于case条件如何工作,它只是一个if/else样式的构造。当对字段求和时,将字段的所有值相加。在上面,不是对字段求和,而是对函数的结果求和对字段进行操作,并返回1或0。rownum从何而来?rownum是外部查询的一部分,用于返回部门中最少没有分析师的行。该查询是rownum的答案是oracle。不确定为什么将其标记为mysql tbh,但在本例中它基本上等同于“限制1”。在h案例我上面关于mysql的“解释”的评论是非常无用的。引用的问题被标记为Oracle,这个问题可能也应该如此。