SQL 查询员工中最高净工资

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

SQL 查询显示净工资大于任何其他员工的员工记录。显示姓名、工资、佣金、净工资和经理姓名。 如果经理姓名为空,则排除。 网薪=工资+佣金。

表:

  • employees
    -- 佣金、dep_id、emp_id、emp_name、雇佣日期、职位名称、经理 ID、薪水

这是我的询问:

SELECT e.emp_name, e.salary, e.commission, (e.salary+e.commission) AS netpay, x.emp_name
FROM employees e
INNER JOIN employees x ON x.emp_id = e.manager_id
WHERE (e.salary+e.commission) = (SELECT MAX(salary+commission) FROM employees where manager_id IS NOT NULL);

我没有为上述查询清除测试用例。任何人都可以帮我解决这个问题吗?

员工表

我得到的输出是

员工姓名 工资 佣金 网络支付 经理
塔克 1600 7000 8600 火焰

我认为这是记录中的最大值,但我仍然不知道解决这个问题有什么问题。

我正在添加创建表和一些插入命令:

CREATE TABLE employees(emp_id number, emp_name varchar2(25), job_name varchar2(25), manager_id number, hire_date date, salary number, commission number, dep_id number) ;

INSERT INTO employees VALUES(68319,'kayling', 'president', null, 11/18/1991,6000,3100,1001); 
INSERT INTO employees VALUES(66928,'blaze', 'manager', 68319,5/1/1991,2750,3200,3001); 
INSERT INTO employees VALUES(68454,'tucker', 'salesman', 66928,9/8/1991,1600,7000,3001); 
INSERT INTO employees VALUES(65646,'clare', 'manager', 68319, 5/9/1991,2550,2300,1001); 
INSERT INTO employees VALUES(67858,'scarlet', 'analyst', 65646, 1/11/1991,3100,520,2001); 
sql oracle sql-limit
6个回答
1
投票

您可能在所提出的问题中错过了一个技巧。预期结果可能“比任何其他员工都好”。这也可能意味着退回那些至少有一名员工的净工资较少的员工!迟到了,但希望对你有帮助!享受吧!

select e1.emp_name,
       e1.salary,
       e1.commission,
       e1.salary+e1.commission as netpay,
       e2.emp_name as manager_name 
from employees e1 
join employees e2 on e1.manager_id = e2.emp_id 
where e1.salary+e1.commission not in (
  select min(salary+commission)
  from employees where manager_id is not null);

0
投票

获取最大值,然后找到与该工资匹配的员工。即:

SELECT e.emp_name, e.salary, e.commission, (e.salary+e.commission) AS netpay
FROM employees e
where (e.salary + +coalesce(e.commission,0)) = (Select max(salary+coalesce(commission,0)) from Employees where manager_id is not null) and
manager_id is not null;

编辑:这是经理姓名:

SELECT e.emp_name, e.salary, e.commission, (e.salary+e.commission) AS netpay, x.emp_name as Manager
FROM employees e
inner join employees x on e.manager_id = x.emp_id
where (e.salary + +coalesce(e.commission,0)) = (Select max(salary+coalesce(commission,0)) from Employees where manager_id is not null);

SQL 小提琴链接


0
投票

您可以使用分层查询来获取经理的姓名(无需阅读该表两次),并且可以使用

FETCH FIRST ROW WITH TIES
来获取净工资最高的人员:

SELECT emp_name,
       salary,
       commission,
       salary + commission AS netpay,
       PRIOR emp_name AS manager_name
FROM   employees
WHERE  manager_id IS NOT NULL
START WITH manager_id IS NULL
CONNECT BY PRIOR emp_id = manager_id 
ORDER BY netpay DESC
FETCH FIRST ROW WITH TIES;

对于您的样本数据,输出:

 EMP_NAME | SALARY | COMMISSION | NETPAY | MANAGER_NAME
 :--------| -----: | ---------: | -----: | :-----------
 tucker   |   1600 |       7000 |   8600 | blaze  

db<>小提琴这里


0
投票
Select
       e.emp_name as "name",
       e.salary as "salary",
       e.commission as "commission",
       nvl2(e.commission,e.salary+e.commission,e.salary)   as "netpay",
       x.emp_name as "Manager name"
from (employees e inner join employees x on e.manager_id = x.emp_id)
 where nvl2(e.commission,e.salary+e.commission,e.salary)  > any (select nvl2(commission,salary+commission,salary) from employees) and x.emp_name is not null ; 

0
投票
SELECT 
   e.emp_name,
   e.salary,
   e.commission,
   e.salary+e.commission NETPAY,
   m.emp_name
FROM employees e
INNER JOIN employees m ON e.manager_id = m.emp_id
WHERE e.salary+e.commission > ANY (SELECT salary+commission FROM 
employees) ;

0
投票

这个问题有一个技巧,我们大多数人都会使用 MAX 函数,但要使用 MIN 函数:

选择 E.EMP_NAME、E.SALARY、E.COMMISSION、(E.SALARY+E.COMMISSION) 作为 NETPAY、M.MANAGER_NAME 来自员工 加入 MANAGER M ON E.MANAGER_ID=M.MANAGER_ID 其中 E.MANAGER_ID 不为空 AND (E.SALARY+E.COMMISSION) NOT IN(SELECT MIN(SALARY+COMMISSION) FROM EMPLOYEES WHERE MANAGER_ID IS NOT NULL);

结果将显示除最低净付款记录之外的所有记录,这就是与此相关的技巧。

© www.soinside.com 2019 - 2024. All rights reserved.