我有3张桌子,Manager
,Employee
& Salary
。以下是所有表格的结构。
管理器
id | Name
---------
111 | AAA
222 | BBB
员工
id | Name | Manager_id | new_policy_deductions
----------------------------------
1 | A B | 111 | 100
2 | A C | 111 | 200
3 | C D | 222 | 200
薪酬
id | employee_id | Month | Emp_Salary | Manager_id
---------------------------------------------------
1 | 1 | Jan | 500 | 111
2 | 1 | Feb | 500 | 111
3 | 1 | Mar | 600 | 111
4 | 2 | Apr | 500 | 111
5 | 1 | Apr | 700 | 111
6 | 3 | Mar | 300 | 222
7 | 3 | Apr | 500 | 222
employee_id
是Employee
表到Salary
表&表中的外键。 manager_id
是从Manager
表到其他表的外键。
现在,我需要构建一个查询,以便得到以下结果。
Manager_id | Net_Salary
-----------------------
111 | 2500
222 | 600
我是如何达到这个数字的?
获取一位经理(500 + 500 + 600 + 500 + 700 = 2800)及以下所有员工的工资总额。然后减去该管理器中的所有new_policy_deductions(100 + 200 = 300)。这意味着111
将有2500(2800 - 300)。
同样,对于222
,我们有600个。
我能够使用2个查询实现此目的,如下所示,
x = select manager_id, sum(Emp_Salary) from Salary group by manager_id
y = select manager_id, sum(new_policy_deductions) from Employee group by manager_id
result = x - y
这可以在单一SQL查询中实现吗?如果是,怎么样?
注意:
修改
以下是查询,这将有助于创建虚拟数据。
create table manager (id int, name text);
create table employee (id int, name text, manager_id int, new_policy_deductions int);
create table salary(id int, employee_id int, emp_salary int, manager_id int);
select * from manager;
INSERT INTO manager
(`id`,
`name`)
VALUES
(111,'AAA'), (222,'BBB');
select * from employee;
INSERT INTO employee
(`id`,
`name`,
`manager_id`,
`new_policy_deductions`)
VALUES
(1,'A B',111,100), (2,'A C B',111,200), (3,'C A B',222,200);
select * from salary;
INSERT INTO salary
(`id`,
`employee_id`,
`month`,
`emp_salary`,
`manager_id`)
VALUES
(1,1,'Jan',500,111), (2,1,'Feb',500,111), (3,1,'Mar',600,111), (4,2,'Apr',500,111), (5,1,'Apr',700,111), (6,3,'Mar',300,222), (7,3,'Apr',500,222);
我在查询中忽略了外键约束,因为它是虚拟数据。实际表确实有外键约束。
答案 0 :(得分:1)
select e.manager_id, (sum(e.Emp_Salary)-sum(s.new_policy_deductions))
FROM Salary as s
LEFT JOIN Employee as e
ON s.manager_id=e.manager_id
group by e.manager_id
这样的东西会是你想要的吗?可能需要一些编辑(错别字是可能的,我没有你的数据库检查)
对评论有疑问,这可能是您感兴趣的内容:
select e.manager_id, (sum(e.Emp_Salary)-sum(s.new_policy_deductions))
FROM Salary as s
LEFT JOIN Employee as e
ON e.id=s.employee_id
group by e.manager_id
这是目前我能想到的最好的表格
答案 1 :(得分:1)
试试这个:
camera.setPreviewCallback(yourcallbackgoeshere);
修改强>
SELECT t1.Manager_id, sumOfSalaries - sumOfDeductions
FROM (
SELECT Manager_id, SUM(Emp_Salary) AS sumOfSalaries
FROM Salary
GROUP BY Manager_id) AS t1
INNER JOIN (
SELECT Manager_id, SUM(new_policy_deductions) AS sumOfDeductions
FROM Employee
GROUP BY Manager_id
) AS t2 ON t1.Manager_id = t2.Manager_id
答案 2 :(得分:0)
我有一个可以帮到你的查询:试试这个 -
var
这是在本地测试并输出你想要的。如果某些属性如表名,字段名称更改则请更改。我认为在我的情况下,表名很小。