SQL With Multiple Condition and Column
-
30-09-2020 - |
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?
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
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