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);
您可能在所提出的问题中错过了一个技巧。预期结果可能“比任何其他员工都好”。这也可能意味着退回那些至少有一名员工的净工资较少的员工!迟到了,但希望对你有帮助!享受吧!
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);
获取最大值,然后找到与该工资匹配的员工。即:
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);
您可以使用分层查询来获取经理的姓名(无需阅读该表两次),并且可以使用
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<>小提琴这里
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 ;
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) ;
这个问题有一个技巧,我们大多数人都会使用 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);
结果将显示除最低净付款记录之外的所有记录,这就是与此相关的技巧。