1

私は SQL Server 2005 を使用しており、基本的なことには精通していますが、少し頭を悩ませている問題があり、助けていただければ幸いです。

作業しようとしているテーブルが 2 つあります。1 つは従業員データベース テーブルで、もう 1 つは組織テーブルです。従業員テーブルでは、各従業員に関連付けられた部門 ID と現在の雇用状況があります。組織テーブルには、部門 ID、その部門がロールアップされる部門、および現在のアクティブなステータスのリストがあります。その部門のアクティブな (値 - A) 従業員の総数と、その下にあるすべてのアクティブな (値 - A) 部門を最後まで返す、部門 ID を指定できるクエリを作成する必要があります。

関連するテーブルと列:
EE_Persons_today
DEPTID
EMPL_STATUS

DEPARTMENT_DATA
DEPTID
REPORTS_TO_DEPT
EFF_STATUS

例:
IT 部門には 300 人が直接割り当てられていますが、ソフトウェアとハ​​ードウェアの 2 つのサブグループもあります。ハードウェアには 100 人が直接割り当てられており、サブグループはありません。Software には 100 人が直接割り当てられており、Enterprise と呼ばれる 1 つのサブグループに 50 人が直接割り当てられています。IT に何人いるかを尋ねると、300+100+100+50 = 550 になります。ソフトウェアに何人いるかを尋ねると、100+50=150 になります。

4

1 に答える 1

0

再帰的 SQL クエリの CTE (Common Table Expressions) を確認してください。以下にサンプルを含めました。あなたの設定でうまくいくかどうか教えてください。

@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 に答える