Oracle sum with case条件语句在sql中的工作原理
前几天,我回答了这个问题,但另一个用户用sum+case条件语句解决了这个问题,在结果中添加了一个边缘条件。因此,我想到了一个问题,下面查询中的语句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(当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,这个问题可能也应该如此。