用“AND”运算符条件减去两个 CASE 语句,当它应该返回特定整数时返回 NULL

问题描述 投票:0回答:1

我正在做这个 StrataScratch SQL 问题。

建议的解决方案对每个部门的每个最大值使用两个子查询,然后减去它们以获得绝对值。我想使用dense_rank/rank窗口函数来解决这个问题,首先对每个部门的工资进行排名,然后对它们进行排序,最高工资将获得数字1。我在执行上述操作的地方编写了这个查询并将其放入CTE中,然后我打算使用 CASE 语句从营销部门选择最高工资,并用另一个 case 语句减去该值以获得工程部门的最大值。

WITH CTE AS
(
select 
    dpt.department,
    emp.salary,
    dense_rank() over (partition by department order by salary desc) as salary_rank
from db_employee as emp
join db_dept as dpt
on emp.department_id=dpt.id
where department = 'engineering' or department = 'marketing'
)
select
(case when department = 'marketing' AND salary_rank = 1 THEN salary END) -
(case when department = 'engineering' AND salary_rank = 1 THEN salary END) as sal_diff
FROM 
CTE

问题是返回了NULL值。我尝试理解为什么会这样,我只看到营销部门的第一个案例语句的值返回结果页面中间的值,就好像它返回一些空行,然后返回所需的薪水(有点奇怪,看起来像一个错误或其他什么)。

我的意思是这部分:

(当部门=“营销”且salary_rank=1然后薪水结束时)=应该返回

下面返回所需的薪水值。 (当部门=“工程”并且salary_rank=1然后薪水结束时) =应该返回48187

我认为 ABS 功能的放置可能有问题,但我无法弄清楚。 我知道我的查询一定有问题(可能是从 cte 查询中选择),所以我希望您能提供帮助。我实在想不通。我的条件陈述或我的策略有问题吗?出于某种原因,我认为这种带有窗口函数的方法可以工作。

提前感谢您的帮助:)

sql database postgresql
1个回答
0
投票

您的情况

(case when department = 'marketing' AND salary_rank = 1 THEN salary END) -
(case when department = 'engineering' AND salary_rank = 1 THEN salary END) as sal_diff

不可能同时都为真,因此其中一个为null

,因此减法的结果必须为空。

因为

department

 不能同时是“营销”
“工程”,因此只有一个 case 语句匹配,并且当没有 else
 子句时,将返回 
null

您需要将 CTE 连接到自身,以便两个值都出现在连接的一行中:

WITH CTE AS ( select dpt.department, emp.salary, dense_rank() over (partition by department order by salary desc) as salary_rank from db_employee as emp join db_dept as dpt on emp.department_id=dpt.id where department in ('engineering', 'marketing') ) select m.salary - e.salary as sal_diff from CTE m join CTE e on e.salary_rank = m.salary_rank and e.department = 'engineering' where m.department = 'marketing'
    
© www.soinside.com 2019 - 2024. All rights reserved.