Domanda

I have 3 tables:

Employee
+----+--------------+--------------------+----------------+
| Id | EmployeeName | EmployeePermission | Position       |
+----+--------------+--------------------+----------------+
|  1 | Christopher  |                  3 | Leader         |
|  2 | Helen        |                  4 | Manager        |
|  3 | Ana          |                  5 | Branch Manager |
+----+--------------+--------------------+----------------+  

Employee Approval
+----+--------------------+--------+-----------+
| Id | EmployeePermission | TaskID | IsApprove |
+----+--------------------+--------+-----------+
|  1 |                  3 | 1a     |         1 |
|  2 |                  4 | 1a     |         0 |
|  3 |                  5 | 1a     |         0 |
|  4 |                  3 | 2b     |         0 |
|  5 |                  4 | 2b     |         0 |
+----+--------------------+--------+-----------+

Items
+----+----------+-------+--------+
| Id | ItemName | Spec  | TaskId |
+----+----------+-------+--------+
|  1 | Ruler    | 2 pcs | 1a     |
|  2 | Book     | 4 pcs | 2b     |
+----+----------+-------+--------+

I want show the name of employee, who already approve and the next approval name, i think like this

+----+--------+-------------+--------------+
| Id | TaskId |  Approval   | NextApproval |
+----+--------+-------------+--------------+
|  1 | 1a     | Christopher | Helen        |
|  2 | 2b     | -           | Christopher  |
+----+--------+-------------+--------------+

For now I use a subquery to show the name but cant get the condition right. I try to use CASE WHEN but it seems complicated and I get lost.

Is there a way to make it more simple?

È stato utile?

Soluzione

Use a Derived Table/CTE to get a single ID for "approved"/"not approved" and LEFT JOIN it two times to Employees:

SELECT TaskID
   ,MAX(CASE WHEN IsApprove = 1 THEN EmployeePermission end) AS Approved_ID
   ,MIN(CASE WHEN IsApprove = 0 THEN EmployeePermission end) AS Not_Approved_ID
FROM "Employee Approval"
GROUP BY TaskID

Altri suggerimenti

This query get the first Approve and first Not Approve:

WITH list AS (
    SELECT ea.TaskId, e.EmployeeName, ea.IsApprove
        , n1 = ROW_NUMBER() OVER(PARTITION BY ea.TaskId ORDER BY ea.IsApprove DESC, ea.Id)
        , n0 = ROW_NUMBER() OVER(PARTITION BY ea.TaskId ORDER BY ea.IsApprove, ea.Id)
    FROM @Employee_Approval ea
    INNER JOIN @Employee e ON e.EmployeePermission = ea.EmployeePermission
)
SELECT i.Id, i.TaskId, Approval = l1.EmployeeName, NextApproval = l2.EmployeeName
FROM @Items i
LEFT JOIN list l1 ON i.TaskId = l1.TaskId AND l1.n1 = 1 AND l1.IsApprove = 1
LEFT JOIN list l2 ON i.TaskId = l2.TaskId AND l2.n0 = 1 AND l2.IsApprove = 0

SQL Fiddle

Output:

Id  TaskId  EmployeeName    EmployeeName
1   1a      Christopher     Helen
2   2b      NULL            Christopher
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top