2012-06-22 5 views
1

SQL Server 2005를 사용하고 있으며 기본 사항을 잘 알고 있지만 조금이라도 도움이 될만한 문제가 있습니다.재귀 SQL 쿼리

저는 두 테이블을 가지고 있습니다. 하나는 직원 데이터베이스 테이블이고 다른 하나는 조직 테이블입니다. 종업원 표에는 각 종업원과 연관된 부서 ID와 현재 고용 상태가 있습니다. 조직 테이블에는 부서 ID 목록, 부서가 롤업하는 부서 및 현재 활성 상태가 있습니다. 해당 부서의 모든 활성 (값 - A) 직원 수와 그 아래에있는 모든 활성 (값 - A) 부서를 모두 반환 할 부서 ID를 부여 할 수있는 쿼리를 만들어야합니다.

관련 테이블 및 컬럼 :
EE_Persons_today
DEPTID
EMPL_STATUS

DEPARTMENT_DATA
DEPTID
REPORTS_TO_DEPT
EFF_STATUS

예 :
부서 IT 부서에는 300 명의 직원이 직접 할당되어 있지만 소프트웨어 및 하드웨어라는 두 개의 하위 그룹도 있습니다. 하드웨어에는 100 명의 직원이 직접 할당되며 하위 그룹은 할당되지 않습니다. 소프트웨어에 직접 할당 된 100 명의 직원과 50 명의 직원이 직접 할당 된 Enterprise라는 하위 그룹이 있습니다. 얼마나 많은 IT 부서에 물어 보면 300 + 100 + 100 + 50 = 550이 될 것입니다. 소프트웨어에 얼마나 많은 사람들이 있는지 묻는다면 100 + 50 = 150이 될 것입니다.

답변

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

빠른 답장을 보내 주셔서 감사합니다. – Squared

+0

잘 듣고 싶습니다! –