Pregunta

tengo 3 mesas:

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     |
+----+----------+-------+--------+

Quiero mostrar el nombre del empleado, que ya aprueba y el próximo nombre de aprobación, pienso así

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

Por ahora, uso una subconsulta para mostrar el nombre, pero no puedo obtener la condición correcta. Trato de usar CASE WHEN pero parece complicado y me pierdo.

¿Hay alguna manera de hacerlo más simple?

¿Fue útil?

Solución

Use una tabla derivada/CTE para obtener una ID única para "aprobado"/"no aprobado" y ÚNASE A LA IZQUIERDA dos veces al 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

Otros consejos

Esta consulta obtiene el primer Approve y el primer 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

Violín SQL

Producción:

Id  TaskId  EmployeeName    EmployeeName
1   1a      Christopher     Helen
2   2b      NULL            Christopher
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top