2016-06-23 3 views
1

Моя таблица имеет две строки для сотрудника с разными значениями статуса и кода сотрудника, и я хочу написать запрос для генерации 1 строки с двумя столбцами для кодов сотрудников на основе разных положение дел.Создайте два столбца из одного, на основе другого where where

Вот данные из таблицы,

EmployeeId First_Name Last_Name Sex Employee_Code Status 
---------- ---------- --------- --- ------------- ------ 
    91224  Jane  Scott  F  7754  Active 
    91224  Jane  Scott  F  8234  Inactive 

Это мой запрос,

SELECT ISNULL(e.EmployeeId, '') AS EmployeeId, 
e.First_Name AS FirstName, e.Last_Name AS LastName, 
e.Sex AS Gender, 
e1.Employee_Code AS CurrentEmployeeCode, 
e2.Employee_Code AS PreviousEmployeeCode 
FROM #tempEmployee e 
LEFT JOIN #tempEmployee e1 ON e.EmployeeId = e1.EmployeeId AND e.Status = 'Inactive' 
LEFT JOIN #tempEmployee e2 ON e.EmployeeId = e2.EmployeeId AND e.Status = 'Active' 
WHERE e.EmployeeId = '91224' 

Это мой результат:

EmployeeId FirstName LastName Gender CurrentEmployeeCode PreviousEmployeeCode 
---------- --------- -------- ------ ------------------- -------------------- 
91224   Jane  Scott  F  NULL      8234 
91224   Jane  Scott  F  7754      NULL 

Я хочу иметь одну строку для этого employeeId с двумя столбцами currentemployeecode и previousemployeecode.

+0

Вы можете рассмотреть возможность размещения некоторые выборочные данные из фактической таблицы '#tempEmployee 'alonng с вашей таблицей результатов – techspider

ответ

0

Вы можете сделать это с некоторой агрегации и группой по

SELECT 
    ISNULL(e.EmployeeId, '') AS EmployeeId, 
    e.First_Name AS FirstName, 
    e.Last_Name AS LastName, 
    e.Sex AS Gender, 
    MAX(e1.Employee_Code) AS CurrentEmployeeCode, 
    MAX(e2.Employee_Code) AS PreviousEmployeeCode 
FROM #tempEmployee e 
LEFT JOIN #tempEmployee e1 
    ON e.EmployeeId = e1.EmployeeId 
    AND e.Status = 'Inactive' 
LEFT JOIN #tempEmployee e2 
    ON e.EmployeeId = e2.EmployeeId 
    AND e.Status = 'Active' 
WHERE e.EmployeeId = '91224' 
GROUP BY 
    ISNULL(e.EmployeeId, ''), 
    e.First_Name, 
    e.Last_Name, 
    e.Sex 

Я даже не уверен, что вы должны ссылаться на исходную таблицу, дать этому идти;

SELECT 
    ISNULL(e.EmployeeId, '') AS EmployeeId, 
    e.First_Name AS FirstName, 
    e.Last_Name AS LastName, 
    e.Sex AS Gender, 
    MAX(CASE WHEN e.Status = 'Inactive' THEN e.Employee_Code ELSE 0 END) AS CurrentEmployeeCode, 
    MAX(CASE WHEN e.Status = 'Active' THEN e.Employee_Code ELSE 0 END) AS PreviousEmployeeCode 
FROM #tempEmployee e 
WHERE e.EmployeeId = '91224' 
GROUP BY 
    ISNULL(e.EmployeeId, ''), 
    e.First_Name, 
    e.Last_Name, 
    e.Sex 

Полный код с данными испытаний;

CREATE TABLE #tempEmployee (EmployeeId int, First_Name varchar(4), Last_Name varchar(5), Sex varchar(1), Employee_Code int, Status varchar(8)) 
INSERT INTO #tempEmployee (EmployeeId, First_Name, Last_Name, Sex, Employee_Code, Status) 
VALUES 
(91224,'Jane','Scott','F',7754,'Active') 
,(91224,'Jane','Scott','F',8234,'Inactive') 

SELECT 
    ISNULL(e.EmployeeId, '') AS EmployeeId, 
    e.First_Name AS FirstName, 
    e.Last_Name AS LastName, 
    e.Sex AS Gender, 
    MAX(CASE WHEN e.Status = 'Inactive' THEN e.Employee_Code ELSE 0 END) AS CurrentEmployeeCode, 
    MAX(CASE WHEN e.Status = 'Active' THEN e.Employee_Code ELSE 0 END) AS PreviousEmployeeCode 
FROM #tempEmployee e 
WHERE e.EmployeeId = '91224' 
GROUP BY 
    ISNULL(e.EmployeeId, ''), 
    e.First_Name, 
    e.Last_Name, 
    e.Sex 

Результат

EmployeeId FirstName LastName Gender CurrentEmployeeCode PreviousEmployeeCode 
91224  Jane  Scott  F  8234    7754 
+0

Это все еще дает мне две строки. Один из них, где CurrentEmployeeCode - null, и тот, где PreviousEmployeeCode имеет значение NULL. – AMeh

+0

Я немного изменил код. Я также тестировал это с окончательным запросом, как показано, это определенно дает мне только одну строку с данными, которые вы предоставили. –

+0

проверить мой ответ - статус искал неправильную таблицу – Paparazzi

0

Вы должны учитывать контекст. Поскольку у вас есть только два значения , легкий способ сделать это просто:

SELECT ISNULL(e.EmployeeId, '') AS EmployeeId, 
e.First_Name AS FirstName, e.Last_Name AS LastName, 
e.Sex AS Gender, 
Min(e1.Employee_Code) AS PreviousEmployeeCode 
Max(e1.Employee_Code) AS CurrentEmployeeCode 
FROM #tempEmployee e 
LEFT JOIN #tempEmployee e1 ON e.EmployeeId = e1.EmployeeId 
WHERE e.EmployeeId = '91224' 

Я также asuming, что новый код сотрудника будет выше.

0

Вы можете сделать что-то подобное с помощью CTE и COALESCE.

;WITH InactiveEmp 
AS (
    SELECT EmployeeId 
     ,First_Name 
     ,Last_Name 
     ,Sex 
     ,Employee_Code 
    FROM #tempEmployee 
    WHERE STATUS = 'Inactive' 
    ) 
    ,ActiveEmp 
AS (
    SELECT EmployeeId 
     ,First_Name 
     ,Last_Name 
     ,Sex 
     ,Employee_Code 
    FROM #tempEmployee 
    WHERE STATUS = 'Active' 
    ) 
SELECT COALESCE(ia.EmployeeId, a.EmployeeId) AS EmployeeId 
    ,COALESCE(ia.First_Name, a.First_Name) AS FirstName 
    ,COALESCE(ia.Last_Name, a.Last_Name) AS LastName 
    ,COALESCE(ia.Sex, a.Sex) AS Gender 
    ,ia.Employee_Code AS CurrentEmployeeCode 
    ,a.Employee_CodE AS PreviousEmployeeCode 
FROM InactiveEmp ia 
FULL JOIN ActiveEmp a 
    ON ia.EmployeeId = a.EmployeeID 
+0

это не удается, если emp не имеет статуса – Paparazzi

+0

Достаточно честный. Я сделал предположение, что это одно или другое. Вы правы, хотя, если есть 3 или более статусов, это не будет правильным решением. – TLaV

0

вы просто проверить статус на столе неправильно (слева)
е .status = «Неактивный»

SELECT distinct 
ISNULL(e.EmployeeId, '') AS EmployeeId, 
e.First_Name AS FirstName, e.Last_Name AS LastName, 
e.Sex AS Gender 
, e1.Employee_Code AS CurrentEmployeeCode , e1.Status 
, e2.Employee_Code AS PreviousEmployeeCode, e2.Status 
FROM #tempEmployee e 
LEFT JOIN #tempEmployee e1 ON e.EmployeeId = e1.EmployeeId AND e1.Status = 'Inactive' 
LEFT JOIN #tempEmployee e2 ON e.EmployeeId = e2.EmployeeId AND e2.Status = 'Active' 
WHERE e.EmployeeId = '91224' 
Смежные вопросы