前几天,我回答了this问题但是其他用户用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;`
并返回部门的员工人数。另外,我想了解此查询的性能。
答案 0 :(得分:5)
据推测,这是你正在努力理解的部分:
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 of
0`。 case
是一个返回值的表达式。 sum()
只是为每个组添加该值。
答案 1 :(得分:1)
让我们尝试将问题分成两部分。
首先,假设您想要一个字段,说明作业名称是'分析师'或不。
SELECT
deptno,
CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END AS IsAnalyst
FROM
employees
对于没有'分析师'的所有作业名,此查询将返回0。和所有那些分析师'
此时你会有类似的东西
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
我认为这个例子胜过千言万语
希望这有帮助