2014-01-23 2 views
0

Пожалуйста найти мойRe- работа по таблице Employee - SQL Query

Emp_Table

Employee Manager Employee Status 
001   001 Active 
002   001 Terminate 
003   002 Active 
004   002 Active 
005   004 Terminate 
006   005 Terminate 
007   006 Active 
008   006 Terminate 
009   006 Active 

Я хочу переставить вышеприведенную таблицу для представления каждого сотрудника должны иметь Active Manager.
ie В моей таблице выше для Employee 003 -> 002 (Менеджер завершен) Поскольку мне нужно перестроить эту строку в Active Manager
Мне нужно, чтобы 002 сообщал, кому согласно моей таблице выше 002 - -> 001 менеджер и Активный тоже поскольку мне нужно обновить, как 003 менеджера 001

Пожалуйста, найти свой результат таблица выглядит - Emp_Reworked_Table

Employee Manager Employee Status 
001   001 Active 
002   001 Terminate 
003   001 Active 
004   001 Active 
005   004 Terminate 
006   004 Terminate 
007   004 Active 
008   004 Terminate 
009   004 Active 

Я попробовал и найти решение, но я не знаю, рекурсивный запрос для выполнения для всех сотрудников. Пожалуйста, помогите

+2

Как узнать, какой активный менеджер должен заменить завершенный? –

+0

Можете ли вы показать, что вы пробовали? – AWinkle

+0

@MikeW, мне нужно посмотреть предыдущий список активных менеджеров upto 001 = 001. Ex from Emp_Table: 005 является менеджером для 006. Поскольку мне нужно проверить, кто является менеджером для 005, в моем случае 004 является менеджером на 005. Были поскольку 004 активен, так как мне нужно обновить менеджер для 006 как 004. Сообщите мне, если вам нужно больше разъяснений –

ответ

6

Возможно, я могу убить свой пример ниже, но суть в том, что вы можете использовать recursive CTE.

IF NOT EXISTS (SELECT 1 
       FROM sys.objects 
       WHERE name = 'Emp_Table' 
        AND type = 'U') 
BEGIN 
    --DROP TABLE dbo.Emp_Table; 
    CREATE TABLE dbo.Emp_Table 
    (
     EmpTable_PK   TINYINT IDENTITY(1, 1) NOT NULL, 
           PRIMARY KEY (EmpTable_PK), 
     EmployeeCode  CHAR(3), 
     ManagerCode   CHAR(3), 
     EmployeeStatus  VARCHAR(16) 
    ); 

    INSERT INTO dbo.Emp_Table (EmployeeCode, ManagerCode, EmployeeStatus) 
    SELECT EmployeeCode, ManagerCode, EmployeeStatus 
    FROM (  SELECT EmployeeCode = NULL, ManagerCode = NULL, EmployeeStatus = NULL 
    UNION ALL SELECT '001', '001', 'Active' 
    UNION ALL SELECT '002', '001', 'Terminate' 
    UNION ALL SELECT '003', '002', 'Active' 
    UNION ALL SELECT '004', '002', 'Active' 
    UNION ALL SELECT '005', '004', 'Terminate' 
    UNION ALL SELECT '006', '005', 'Terminate' 
    UNION ALL SELECT '007', '006', 'Active' 
    UNION ALL SELECT '008', '006', 'Terminate' 
    UNION ALL SELECT '009', '006', 'Active') l 
    WHERE l.EmployeeCode IS NOT NULL 
END; 
GO 

;WITH cte_Hierarchy AS (
    SELECT et.EmpTable_PK, et.EmployeeCode, 
      et.ManagerCode, et.EmployeeStatus, 
      ManagerStatus = mt.EmployeeStatus 
    FROM dbo.Emp_Table et 
    INNER JOIN dbo.Emp_Table mt 
     ON et.ManagerCode = mt.EmployeeCode 
    UNION ALL 
    SELECT h.EmpTable_PK, h.EmployeeCode, 
      ManagerCode = et.ManagerCode, 
      h.EmployeeStatus, 
      mt.EmployeeStatus 
    FROM cte_Hierarchy h 
    INNER JOIN dbo.Emp_Table et 
     ON h.ManagerCode = et.EmployeeCode 
    INNER JOIN dbo.Emp_Table mt 
     ON et.ManagerCode = mt.EmployeeCode 
    WHERE h.ManagerStatus = 'Terminate' 
     AND et.EmployeeCode <> et.ManagerCode) 
SELECT EmployeeCode, ManagerCode, EmployeeStatus 
FROM cte_Hierarchy 
WHERE ManagerStatus = 'Active' 
ORDER BY EmpTable_PK, EmployeeCode, ManagerCode; 
+0

@Avartx, Awesome Answer! Я ценю ваш ответ. Благодарю. –

Смежные вопросы