2016-06-23 12 views
1

異なるステータスと従業員コードの値を持つ従業員に対して、私のテーブルには2つの行があり、異なる2つの従業員コードに対して1つの行を生成するクエリを作成したい状態。ここで異なるwhere句に基づいて2つの列を作成

は、

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 

私はこのために1行を持つようにしたいですemployeeIdにはcurrentemployeecodeとpreviousemployeecodeという2つの列があります。

+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

これはまだ2行を返します。 CurrentEmployeeCodeがnullの場合と、PreviousEmployeeCodeがnullの場合。 – AMeh

+0

私はちょうどわずかにコードを微調整しました。また、最後のクエリでこれをテストしましたが、提供したデータで1行しか表示できません。 –

+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' 
あなたが実際のテーブル `からいくつかのサンプルデータを掲示する検討すること
関連する問題