sum with case 条件语句如何在 sql 中工作
How sum with case conditional statement works in sql
前几天,我回答了 问题,但后来其他用户使用 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;`
和return一个部门的员工人数。另外,我想了解一下这个查询的性能。
据推测,这是您难以理解的部分:
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
是一个表达式,表示returns一个值。 sum()
只是将每个组的值相加。
让我们尝试将问题分成两部分。
首先,假设您想要一个字段说明作业名称是否为 'Analyst'。
SELECT
deptno,
CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END AS IsAnalyst
FROM
employees
此查询将为所有非 'Analyst' 的作业名称 return 0,对于所有 'Analyst'
的作业名称为 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 分组。
此时(我从查询中删除了 order by
以简化它)您将得到以下输出
deptno numAnalysts
1 1
2 3
我认为举个例子胜过千言万语
希望对您有所帮助
前几天,我回答了 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;`
和return一个部门的员工人数。另外,我想了解一下这个查询的性能。
据推测,这是您难以理解的部分:
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
是一个表达式,表示returns一个值。 sum()
只是将每个组的值相加。
让我们尝试将问题分成两部分。
首先,假设您想要一个字段说明作业名称是否为 'Analyst'。
SELECT
deptno,
CASE WHEN jobname = 'Analyst' THEN 1 ELSE 0 END AS IsAnalyst
FROM
employees
此查询将为所有非 'Analyst' 的作业名称 return 0,对于所有 'Analyst'
的作业名称为 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 分组。
此时(我从查询中删除了 order by
以简化它)您将得到以下输出
deptno numAnalysts
1 1
2 3
我认为举个例子胜过千言万语
希望对您有所帮助