SQL: Teilweises Überschneiden von Daten ermitteln

Aus DBWiki
Wechseln zu: Navigation, Suche

Zurück zur Übersicht



Im trivialen Fall kann nach den Feldern, die die Menge ausmachen, gruppiert werden.


Es sollen z.B. die Anzahl aller Besucher von Seminaren entsprechend ihrer Stufe ausgegeben werden.

Allgemeine Lösung

Hinweis für Access-Anwender

Um die folgenden Abfragen selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein.

SELECT sem_nr,
       stufe,
       COUNT( * ) AS num_besucher
FROM   seminar
GROUP  BY sem_nr, stufe
sem_nr stufe num_besucher
SALA101 1 2
SALA101 2 3
SALA101 3 2
SALA101 4 1
SALC108 1 2
SALC108 2 2
SALC108 3 2


Jetzt soll zusätzlich die Randbedingung gelten, dass mindestens zwei Besuche eines Seminars in einer Stufe vorliegen müssen, um in die Ausgabe aufgenommen zu werden. Hierzu verwendet man die HAVING-Klausel nach der Angabe der Gruppierung.

Allgemeine Lösung

SELECT sem_nr,
       stufe,
       COUNT( * ) AS num_besucher
FROM   seminar
GROUP  BY sem_nr, stufe
HAVING COUNT( * ) > 1
sem_nr stufe num_besucher
SALA101 1 2
SALA101 2 3
SALA101 3 2
SALC108 1 2
SALC108 2 2
SALC108 3 2


Soll die Ausgangsmenge reduziert werden, kann man zusätzlich eine WHERE-Klausel einbinden, die die Datenmenge vor der Gruppierung einschränkt. Soll z.B. die zuvor gemachte Einschränkung nur für Seminare gelten, die von Mitarbeiter 7654 und 7521 besucht wurden, gestaltet sich die Abfrage so.

Allgemeine Lösung

SELECT sem_nr,
       stufe,
       COUNT( * ) AS num_besucher
FROM   seminar
WHERE  ma_nr IN( 7654, 7521 )
GROUP  BY sem_nr, stufe
HAVING COUNT( * ) > 1
sem_nr stufe num_besucher
SALA101 2 2
SALC108 1 2
SALC108 2 2
SALC108 3 2



Zurück zur Übersicht