2016-06-23 2 views
1

내 상태 및 직원 코드 값이 다른 직원에 대한 내 테이블에 두 개의 행이 있고 다른 코드를 기반으로 직원 코드에 대해 두 개의 열이있는 행 1 개를 생성하는 쿼리를 작성하고 싶습니다. 지위. 나는 이것에 대한 하나 개의 행을 갖고 싶어서로 다른 where 절을 기반으로 하나에서 두 개의 열 만들기

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

: 이것은 내 쿼리가

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에는 currentemployeecode와 previousemployeecode의 두 열이 있습니다.

+0

#tempEmployee '결과 표와 함께하기 – 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가 널인 경우와 PreviousEmployeeCode가 널인 경우. – AMeh

+0

코드를 약간 수정했습니다. 필자는 표시된 것처럼 마지막 쿼리를 통해이를 테스트했으며, 제공된 데이터가있는 행을 하나만 제공합니다. –

+0

내 대답을 확인하십시오 - 상태가 잘못된 테이블로 보입니다 – Paparazzi

0

당신은 상황을 고려해야합니다. 나는 또한 신입 사원 코드가 더 높을 것이라고 asuming하고

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' 

: 만 두 값을 가지고 있기 때문에,이 작업을 수행 할 수있는 쉬운 방법은이다.

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' 
당신은 실제 테이블 '에서 일부 샘플 데이터를 게시 고려할 수
관련 문제