2012-06-22 3 views
1

Я использую SQL Server 2005 и знаком с базой, но у меня есть проблема, которая немного над головой, на что я был бы признателен за любую помощь.Рекурсивный SQL-запрос

У меня есть две таблицы, с которыми я пытаюсь работать. Одна из них - таблица базы данных сотрудников, а одна - таблица организации. В таблице сотрудников каждый сотрудник имеет идентификатор отдела, связанный с ними, и текущий статус занятости. В таблице организации есть список идентификаторов отделов, в отдел которых входит отдел, и текущий активный статус. Мне нужно создать запрос, который я могу предоставить идентификатору отдела, который вернет общее число активных (значение-A) сотрудников в этом отделе и все активные (значения-A) отделы ниже всего до конца.

Соответствующие таблицы и столбцы:
EE_Persons_today
DEPTID
EMPL_STATUS

DEPARTMENT_DATA
DEPTID
REPORTS_TO_DEPT
EFF_STATUS

Пример:
Отдел IT имеет 300 человек, которым он непосредственно назначен, но также имеет 2 подгруппы, Программное обеспечение и аппаратное обеспечение. Аппаратное обеспечение имеет 100 человек, непосредственно назначенных ему, и никаких подгрупп. Программное обеспечение имеет 100 человек, непосредственно назначенных ему, и 1 подгруппу под названием Enterprise с 50 людьми, непосредственно назначенными ей. Если я спрошу, сколько из них будет в ИТ, это будет 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

Приятно слышать! –