Consulta con prioridad
-
30-09-2019 - |
Pregunta
Tengo una consulta que no puedo llegar a la derecha de trabajo. Tengo 3 tablas; Persona, PersonProgram y categoría.
Person: ID, ....
PersonProgram: ID, PersonID, Category, Code ...
Category: ID, ...
En la tabla 1 persona tiene registro de cada persona y el PersonProgram tiene múltiples programas por persona. Hay 4 categorías y tengo que tirar en una sola fila, de cada persona, con el Programa específico de cada categoría.
Persona Tabla:
1
2
3
PersonProgram Tabla
1, 1, 1, 1
2, 1, 2, 1
3, 1, 1, 3
4, 2, 1, 1
5, 2, 3, 3
Lo que el resultado deseado debe ser:
PersonID, ProgramIDforCat1, ProgramIDforCat2, ProgramIDforCat3, ProgramIDforCat4
1, 1, 2, NULL, NULL
2, 1, NULL, 3, NULL
El problema es que hay varios registros de programa para cada persona y categoría con un código de 1, 2 o 3. Me necesidad de dar prioridad a continuación Código 1 Código 3 e ignorar el resto, mientras que todavía sólo tirando 1 registro, o NULL si no existe.
Estoy perdiendo que tratar de conseguir que esto funcione.
FYI, que tiene que ser en una vista.
Gracias por cualquier ayuda.
Solución
WITH Person AS
(
SELECT 1 AS ID UNION ALL
SELECT 2 AS ID UNION ALL
SELECT 3 AS ID
),
PersonProgram AS
(
SELECT 1 AS ID, 1 AS PersonID, 1 AS Category, 1 AS Code UNION ALL
SELECT 2, 1, 2, 1 UNION ALL
SELECT 3, 1, 1, 3 UNION ALL
SELECT 4, 2, 1, 1 UNION ALL
SELECT 5, 2, 3, 3
),
pp2 AS
(
SELECT *
,ROW_NUMBER() OVER
(PARTITION BY PersonID, Category
ORDER BY CASE WHEN Code = 1 THEN 0 ELSE 1 END,
CASE WHEN Code = 3 THEN 0 ELSE 1 END) AS RN
FROM PersonProgram
)
select PersonID ,
max(case when Category =1 then pp2.ID end) ProgramIDforCat1,
max(case when Category =2 then pp2.ID end) ProgramIDforCat2,
max(case when Category =3 then pp2.ID end) ProgramIDforCat3,
max(case when Category =4 then pp2.ID end) ProgramIDforCat4
from Person p join pp2
on pp2.PersonID = p.ID
WHERE RN=1
group by PersonID
Devuelve
PersonID ProgramIDforCat1 ProgramIDforCat2 ProgramIDforCat3 ProgramIDforCat4
----------- ---------------- ---------------- ---------------- ----------------
1 1 2 NULL NULL
2 4 NULL 5 NULL
Esto es diferente de los resultados esperados. (Aunque yo puedo hacer lo mismo mediante el uso de pp2.Category
en lugar de pp2.ID
) ¿Me podría aclarar?