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.

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top