作者:男人--沉默底线 | 来源:互联网 | 2024-12-02 19:56
考虑以下三张表的数据结构:
表1 - 员工与管理者关系表
Name Manager
A NULL
B A
C B
表2 - 关闭项目表
Name Closing_in
D B
E B
F C
表3 - 项目金额表
Name Amount
D 10
E 10
F 10
目标是计算每个员工(包括直接下属)的总金额。具体来说,我们需要一个查询结果如下所示:
Name Subamount
A 30
B 20
C 10
D 10
E 10
F 10
为了解决这个问题,可以使用递归CTE(Common Table Expressions)来遍历每个员工及其所有下属,然后聚合这些记录的金额。下面是一个可能的解决方案:
WITH EmployeeHierarchy AS (SELECT Name, Manager, Name AS TopManager FROM 表1 WHERE Manager IS NULL UNION ALL SELECT e.Name, e.Manager, eh.TopManager FROM 表1 e JOIN EmployeeHierarchy eh ON e.Manager = eh.Name) SELECT eh.Name, SUM(a.Amount) AS Subamount FROM EmployeeHierarchy eh LEFT JOIN 表2 c ON eh.Name = c.Closing_in LEFT JOIN 表3 a ON c.Name = a.Name GROUP BY eh.Name, eh.TopManager ORDER BY eh.TopManager, eh.Name;
这个查询首先构建了一个包含所有员工及其顶级管理者的层次结构,然后将这个结构与关闭项目表和项目金额表进行联接,最后按员工名分组并计算总金额。