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)
并返回部门中的员工人数。另外,我想了解此查询的性能。
大概这是您要努力理解的部分:
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)
确实,这是一个简单的聚合查询。查询正在做的是:
employeesjobname为,'Analyst'则分配的值1(这是case语句. Otherwise, assign a value of0`。case是一个返回值的表达式。的sum()是简单地增加了每个组的值。
让我们尝试将问题分成两部分。
首先,假设您想要一个字段来说明职位名称是否为“分析师”。
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)
我认为一个例子胜过千言万语
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
22493 次 |
| 最近记录: |