Select Join Select Hilfe

Jeziro

Neuer Benutzer
Beiträge
1
Seit Tagen zermartere ich mir das Gehirn, wie ich eine Tabelle mit den gewünschten Informationen zusammenschustern kann. Ich bekomme es einfach nicht hin. Ich habe vier Tabellen, in denen sich Schülernamen, Schuljahresabschnitte, Fächernoten und Fächerbezeichnungen befinden:

SCHUELER
id | Name | Vorname
-----+-----------------+-----------------
193 | Müller | Maxine
194 | Mustermann | Theo

ABSCHNITT
id | Schueler_ID | Jahr | Halbjahr
---+-----------------+-------+------------
15 | 193 | 2014 | 1
16 | 193 | 2014 | 2
17 | 193 | 2015 | 1
18 | 193 | 2015 | 2
19 | 194 | 2014 | 1
20 | 194 | 2014 | 2
21 | 194 | 2015 | 1
22 | 194 | 2015 | 2

NOTEN
id | abschnitt_ID | Fach_ID | Note
---+-----------------+-------------+------------
89 | 17 | 103 | 2
90 | 17 | 97 | 3+
91 | 17 | 15 | 1
92 | 17 | 17 |2
93 | 18 | 103 | 1
94 | 18 | 97 | 3
95 | 18 | 18 | 1-

FAECHER
id | FachKrz | Fach_Bezeichnung
-----+-----------------+--------------------------
15 | D | Deutsch
18 | EK | Erdkunde
17 | GE | Geschichte
97 | E | Englisch
103 | M | Mathematik

Ich möchte mir eine Tabelle folgender Form für alle Schüler zusammenstellen

NOTEN2015
schueler_id | Faecher_Abschitt12 | Note_Abschnitt1 | Note_Abschnitt2
---------------+-----------------------+-----------------------+------------------------+-------------------------
193 | M | 2 | 1
193 | E | 3+ | 3
193 | D | 1 | leer
193 | GE | 2 | leer
193 | EK | leer | 1-

Das besondere dabei ist, dass in Spalte 2 alle Faecher vorkommen sollen, die in Abschnitt 1 und 2 belegt wurden. In den Spalten 3 und 4 sollen die Noten zu den passenden Fächern stehen, sofern es eine Note zum Fach im Abschnitt gibt. Ich bekomme die Summe aller Fächer eines Schülers und die Leereinträge einfach nicht hin, da in der gesamten Datenbank natürlich zahlreiche Schüler mit allen möglichen Fächern und Noten tummeln. Beim Joinen bekomme ich nie das gewünschte Resultat.

Hat jemand einen Tipp für mich.
 
Werbung:
Code:
[local]:test=*# select schueler, fach, string_agg(abschnitt_1,'') as abschnitt1, string_agg(abschnitt_2,'') as abschnitt2 from (select s as schueler, f as fach, case when a_id=17 then note else null end as abschnitt_1, case when a_id=18 then note else null end as abschnitt_2 from (select s.id as s, f.id as f from schueler s cross join faecher f) x left join noten n on x.f=n.fach_id where x.s = 193) foo group by 1,2;
 schueler | fach | abschnitt1 | abschnitt2
----------+------+------------+------------
  193 |  15 | 1  |
  193 |  17 | 2  |
  193 |  18 |  | 1-
  193 |  97 | 3+  | 3
  193 |  103 | 2  | 1
(5 rows)

[local]:test=*#

Die Fächerbezeichnungen da noch zu joinen überlasse ich Dir zur Übung.
 
Werbung:
Oder du machst 2 Joins, weniger elegant aber kann auch MySQL:
Code:
SELECT s.id,s.name,s.vorname,a1.*,a2.*
FROM schueler s
INNER JOIN abschnitt a1
ON s.id = a1.schueler_id
AND a1.jahr = 2015
AND a1.halbjahr = 1
INNER JOIN abschnitt a2
ON s.id = a2.schueler_id
AND a2.jahr = 2015
AND a2.halbjahr = 2
Dazu dann noch die Noten und Fächer jeweils zweimal joinen, ist eingentlich nur Fleißarbeit. MySQL kann diverse Dinge nicht die es einfacher machen würden.
 
Zurück
Oben