自引用表。MySQL

4

我有另一个问题,似乎无法完全理解这个概念。

我有一张表格:

EMPLOYEES

| EMP_NO | APELLIDO | OFFICE | DIRECTOR | START_DATE | SALARY | COMMISSION | DEP_NO |

我需要获取办公室为“董事”的员工数据(很容易,但是……),并且还需要包括一列返回所有下属的完整工资(工资+佣金)。

现在我知道我需要“复制”表格以便能够让它引用自身(EMPLOYEES e1,EMPLOYEES e2等)。但是我真的在获取这些下属的总工资方面感到非常困扰。

有什么想法吗?(请帮忙)

编辑

对不起,大家,是我错了。好的,这里有一些样本数据:

+--------+----------+------------+----------+------------+---------+----------+--------+
| EMP_NO | SURNAME  | OFFICE     | DIRECTOR | START_DATE | SALARY  |COMMISSION| DEP_NO |
+--------+----------+------------+----------+------------+---------+----------+--------+
|   7499 | ALONSO   |SALESPERSON |     7698 | 1981-02-23 | 1400.00 |   400.00 |     30 |
|   7521 | LOPEZ    | EMPLOYEE   |     7782 | 1981-05-08 | 1350.50 |     NULL |     10 |
|   7654 | MARTIN   |SALESPERSON |     7698 | 1981-09-28 | 1500.00 |  1600.00 |     30 |
|   7698 | GARRIDO  | DIRECTOR   |     7839 | 1981-05-01 | 3850.12 |     NULL |     30 |
|   7782 | MARTINEZ | DIRECTOR   |     7839 | 1981-06-09 | 2450.00 |     NULL |     10 |
|   7839 | REY      |    CEO     |     NULL | 1981-11-17 | 6000.00 |     NULL |     10 |
|   7844 | CALVO    |SALESPERSON |     7698 | 1981-09-08 | 1800.00 |     0.00 |     30 |
|   7876 | GIL      |  ANALIST   |     7782 | 1982-05-06 | 3350.00 |     NULL |     20 |
|   7900 | JIMENEZ  | EMPLOYEE   |     7782 | 1983-03-24 | 1400.00 |     NULL |     20 |
+--------+----------+------------+----------+------------+---------+----------+--------+

我现在需要做的是返回一个表格,其中包含员工GARRIDO和MARTINEZ的详细信息(EMP_NO 7698和7782),以及额外的列,该列将包含所有直接下属的总工资。就像这样:
+--------+----------+------------+----------+------------+---------+----------+--------+-----------+
| EMP_NO | SURNAME  | OFICIO     | DIRECTOR | FECHA_ALTA | SALARIO | COMISION | DEP_NO | TOTAL_EMP |
+--------+----------+------------+----------+------------+---------+----------+--------+-----------+    
|   7698 | GARRIDO  | DIRECTOR   |     7839 | 1981-05-01 | 3850.12 |     NULL |     30 |   6700    |
|   7782 | MARTINEZ | DIRECTOR   |     7839 | 1981-06-09 | 2450.00 |     NULL |     10 |  1350.50  |
+--------+----------+------------+----------+------------+---------+----------+--------+-----------+

发布样本数据和期望输出 - Matt
你只需要直接下属的薪资,还是需要获取他们所有下属以及所有下属的下属等的总薪资? - Tom H
导演如何与员工相关联?是通过“DIRECTOR”列吗? - Chin Leung
Chin Leung,董事长也是一名员工,因此他的emp_no被放置在他的下属的DIRECTOR列中。 :) - CNB
1个回答

2

我相信这样做就可以了。你只需要与其他需要的行进行JOIN,然后简单地分组即可得到所需的聚合金额。

SELECT
    D.emp_no,
    D.apellido,    -- Why is there one column named in Spanish and the rest in English?
    D.office,
    D.director,
    D.start_date,
    D.salary,
    D.commission,
    D.dep_no,
    SUM(COALESCE(S.salary, 0) + COALESCE(S.commission, 0)) AS subordinates_compensation
FROM
    Employees D
LEFT OUTER JOIN Employees S ON S.director = D.emp_no
WHERE
    D.office = 'Director'
GROUP BY
    D.emp_no,
    D.apellido,
    D.office,
    D.director,
    D.start_date,
    D.salary,
    D.commission,
    D.dep_no

谢谢,我现在正在尝试它。因为我有点马虎,没有翻译那个 :) - CNB
好的。谢谢,确实有效。我只需要排除董事的薪水。:) 太棒了,谢谢(我真的还没有准备好考试)。 - CNB
如果主管的行指向自身(director = emp_no),那么您可以在 JOIN 子句中添加一个条件来消除该行(AND S.emp_no <> D.emp_no)。 - Tom H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接