2012-06-22 253 views
1

我正在使用SQL Server 2005,並且熟悉基礎知識,但是有一個問題比我的腦袋稍微高一點,我將不勝感激任何幫助。遞歸SQL查詢

我有兩個表,我正在嘗試使用。一個是員工數據庫表,另一個是組織表。在員工表中,每個員工都有一個與他們相關的部門ID和當前的僱傭狀態。在組織表中,有一個部門ID列表,該部門彙總的部門以及當前的活動狀態。我需要創建一個查詢,我可以給出一個部門ID,以便將該部門中活動的(A值)員工和下面的所有活動(A值)部門的總數返回到底部。

相關表和列:
EE_Persons_today
DEPTID
EMPL_STATUS

DEPARTMENT_DATA
DEPTID
REPORTS_TO_DEPT
EFF_STATUS

示例:
IT部門有300人直接分配給它,但也有2個子組,軟件和硬件。硬件有100人直接分配給它,並沒有子組。軟件有100個人直接分配給它,1個子組稱爲Enterprise,有50個人直接分配給它。如果我問IT中有多少人,那麼它會是300 + 100 + 100 + 50 = 550.如果我問軟件中有多少人,那麼它會是100 + 50 = 150。

回答

0

檢查CTE(公用表表達式)以進行遞歸SQL查詢。我在下面包含了一個示例。請讓我知道它是否適用於您的設置。

將@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' 
+0

這工作得很好!非常感謝您的快速回復。 – Squared

+0

很高興聽到它! –