Abfrage mit Priorität
-
30-09-2019 - |
Frage
ich eine Abfrage habe, dass ich nicht zur Arbeit richtig machen kann. Ich habe 3 Tabellen; Person, PersonProgram und Kategorie.
Person: ID, ....
PersonProgram: ID, PersonID, Category, Code ...
Category: ID, ...
Die Tabelle Person hat 1 Datensatz für jede Person und die PersonProgram mehrere Programme pro Person hat. Es gibt vier Kategorien, und ich muß in eine einzige Zeile ziehen, jeder Person, mit spezifischem Programm der jeweiligen Kategorie.
Person Tabelle:
1
2
3
PersonProgram Tabelle
1, 1, 1, 1
2, 1, 2, 1
3, 1, 1, 3
4, 2, 1, 1
5, 2, 3, 3
Was das gewünschte Ergebnis sollte sein:
PersonID, ProgramIDforCat1, ProgramIDforCat2, ProgramIDforCat3, ProgramIDforCat4
1, 1, 2, NULL, NULL
2, 1, NULL, 3, NULL
Das Problem ist, dass es mehrere Programm Datensätze für jede Person ist und die Kategorie mit einem Code von 1, 2 oder 3. Ich brauche Priorität zu setzen auf Code 1 dann Code 3 und den Rest zu ignorieren, während immer noch nur 1 Datensatz ziehen, oder NULL, wenn es nicht vorhanden ist.
Ich verliere es versuchen, dies zu Arbeit zu erhalten.
FYI, hat es in Hinblick auf sein.
Vielen Dank für jede Hilfe.
Lösung
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
Returns
PersonID ProgramIDforCat1 ProgramIDforCat2 ProgramIDforCat3 ProgramIDforCat4
----------- ---------------- ---------------- ---------------- ----------------
1 1 2 NULL NULL
2 4 NULL 5 NULL
Dies unterscheidet sich von Ihrem erwarteten Ergebnissen. (Obwohl ich kann es das gleiche machen, indem Sie pp2.Category
anstatt pp2.ID
) Können Sie das klären?