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.

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top