1

我正在使用 SQL Server 2005 并且熟悉基础知识,但是有一个问题让我有点头晕目眩,我将不胜感激。

我有两张我正在尝试使用的桌子。一个是员工数据库表,一个是组织表。在员工表中,每个员工都有一个与他们相关联的部门 ID 和当前的就业状态。在组织表中有一个部门 ID 列表,该部门在哪个部门下汇总,以及当前的活动状态。我需要创建一个查询,我可以给它一个部门 ID,它将返回该部门中的活动(值 - A)员工总数以及它下面的所有活动(值 - A)部门一直到底部。

相关表和列:
EE_Persons_today
DEPTID
EMPL_STATUS

DEPARTMENT_DATA
DEPTID
REPORTS_TO_DEPT
EFF_STATUS

示例:
IT 部门有 300 人直接分配给它,但也有 2 个子组,软件和硬件。硬件有 100 人直接分配给它,没有子组。Software 有 100 人直接分配给它,1 个子组称为 Enterprise,有 50 人直接分配给它。如果我问有多少人在 IT,那将是 300+100+100+50 = 550。如果我问有多少人在软件领域,那将是 100+50=150。

4

1 回答 1

0

查看递归 SQL 查询的 CTE(通用表表达式)。我在下面包含了一个示例。请让我知道它是否适用于您的设置。

将@INPUT 的值更改为您请求人数的部门(其中 EMPL_STATUS= 'A')。

DECLARE @INPUT INT
SET @INPUT = 1


DECLARE @DEPARTMENT_DATA TABLE
(
    DEPTID INT,
    REPORTS_TO_DEPT INT,
    EFF_STATUS INT
)


INSERT INTO @DEPARTMENT_DATA
SELECT 1, NULL, 1
UNION SELECT 2, 1, 1
UNION SELECT 3, 2, 1
UNION SELECT 4, 1, 1
UNION SELECT 5, 4, 1


DECLARE @EE_Persons_today TABLE
(
    ID INT IDENTITY(1,1),
    DEPTID INT,
    EMPL_STATUS VARCHAR(1)
)

INSERT INTO @EE_Persons_today
SELECT 2, 'A'
UNION ALL SELECT 2, 'A'
UNION ALL SELECT 2, 'A'
UNION ALL SELECT 2, 'A'
UNION ALL SELECT 2, 'B'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'B'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'B'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 3, 'A'
UNION ALL SELECT 4, 'B'
UNION ALL SELECT 4, 'A'
UNION ALL SELECT 5, 'A'
UNION ALL SELECT 5, 'A'
UNION ALL SELECT 5, 'B'
UNION ALL SELECT 5, 'A'


; WITH CTE AS
(
    SELECT a.DEPTID
    FROM @DEPARTMENT_DATA a
    WHERE a.DEPTID = @INPUT

        UNION ALL

    SELECT a.DEPTID
    FROM @DEPARTMENT_DATA a
    JOIN CTE c
        ON a.REPORTS_TO_DEPT = c.DEPTID
) 
SELECT COUNT(*)
FROM @EE_Persons_today a
JOIN CTE c
    ON a.DEPTID = c.DEPTID
WHERE a.EMPL_STATUS = 'A'
于 2012-06-22T17:30:39.193 回答