如何在MYSQL中的优化/一个查询中进行组嵌套求和?

时间:2016-02-08 14:41:19

标签: mysql

我有3张桌子,ManagerEmployee& 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_idEmployee表到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查询中实现吗?如果是,怎么样?

注意:

  • 实际的表名与我在这里使用的不同。
  • 我无法修改表格结构。它是很久以前设计的。
  • 不允许嵌套SQL查询,因为这相当于2次查询,效率低下。

修改

以下是查询,这将有助于创建虚拟数据。

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);

我在查询中忽略了外键约束,因为它是虚拟数据。实际表确实有外键约束。

3 个答案:

答案 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

这是在本地测试并输出你想要的。如果某些属性如表名,字段名称更改则请更改。我认为在我的情况下,表名很小。