Mitarbeiter sind eindeutig identifiziert durch die Sozialversicherungsnummer (SVNR). Es wird auch noch der Name (NAME), die Adresse (ADRESSE) und das Geburtsdatum (GEBDAT) gespeichert. Optional kann für gekündigte Mitarbeiter ein Kündigungsdatum (DATUM) gespeichert werden. Kassadienst und Bademeister sind Mitarbeiter. Für Bademeister ist bekannt, welche Ausbildung sie absolviert haben (AUSBILDUNG). Es wird auch gespeichert, welche Bademeister von welchen anderen Bademeistern vertreten werden können. Ein Schwimmbecken wird identifiziert durch eine Bezeichnung (BEZ), außerdem ist die Wassertiefe (TIEFE) gespeichert. Messwerte sind identifiziert durch das Schwimmbecken, in dem sie gemessen wurden und dem Zeitpunkt (ZEITPKT). Dann wird noch die Bezeichnung des Wertes (BEZ) z.B. pH-Wert und der Wert (WERT) selbst gespeichert. Sollte ein Werte nicht der Norm entsprechen, so wird gespeichert, welche Maßnahmen in Bezug auf diesen einen Wert eingeleitet wurden. Jede Maßnahme wird identifiziert durch einen Zeitpunkt (ZEITPKT) und ein Mittel (MITTEL) das angewendet wurde. Außderdem wird die Menge (MENGE) des Mittels gespeichert. Es wird auch gespeichert welcher Bademeister welche Maßnahmen getroffen hat. Bademeister haben auch noch eine andere Aufgabe: die Aufsicht. Daher muss vermerkt werden, welche Bademeister in welchem Zeitraum (VON, BIS) welche Becken als Rettungsschwimmer beaufsichtigen. Eine Eintrittskarte wird identifiziert durch eine laufende Tagesnummer (LFDNR) und durch ein Datum (VON) von dem an sie gültig ist. Außerdem wird das Ende der Gültigkeit (BIS) und der Preis (PREIS) gespeichert. Es wird auch gespeichert, welche Mitarbeiter vom Kassadienst welche Karte verkauft haben. Eine Karte kann dabei nur von einem Kassadienstmitarbeiter verkauft werden. Kategorien werden identifiziert durch eine Bezeichnung (BEZ) z.B. Student, halbtags... Dazu wird noch eine genaue Beschreibung (BESCHREIBUNG) gespeichert. Karten können mehrere Kategorien zugeordnet sein. Eine Jahreskarte ist eine besondere Form der Karte. Es wird hierfür gespeichert welche Kunden welche Jahreskarten besitzen. Eine Jahreskarte ist hingegen einem einzigen Kunden zugeordnet. Ein Kunde ist eindeutig identifiziert duch eine Kundennummer (KNR). Zu jedem Kunden wird auch der Name (NAME), die Adresse (ADRESSE) sowie ein Foto (FOTO) gespeichert.
1)
Geben Sie jene Kassadienst-Mitarbeiter aus, die ab dem 1. Januar 1970 geboren wurden. Verwenden Sie dazu die Funktion TO_DATE und folgendes Datumsformat: DD-MM-YYYY. Ordnen Sie die Ergebnisse absteigend nach der Sozialversicherungsnummer.
SELECT * FROM Mitarbeiter NATURAL JOIN Kassadienst WHERE gebdat >= TO_DATE('01-01-1970', 'DD-MM-YYYY') ORDER BY svnr DESC;
SELECT * FROM Mitarbeiter JOIN Kassadienst USING(svnr) WHERE gebdat >= TO_DATE('01-01-1970', 'DD-MM-YYYY') ORDER BY svnr DESC;
2.1)
Geben Sie das Geburtsdatum des aeltesten Bademeisters aus.
SELECT MIN(gebdat) FROM Bademeister NATURAL JOIN Mitarbeiter;
2.2)
Geben Sie die Sozialversicherungsnummer, den Namen und das Geburtsdatum des aeltesten Bademeisters aus.
SELECT svnr, name, gebdat FROM Bademeister NATURAL JOIN Mitarbeiter WHERE gebdat = (SELECT MIN(gebdat) FROM Bademeister NATURAL JOIN Mitarbeiter);
SELECT svnr, name, gebdat FROM Bademeister NATURAL JOIN Mitarbeiter WHERE gebdat <= ALL (SELECT gebdat FROM Bademeister NATURAL JOIN Mitarbeiter);
SELECT m.svnr, m.name, m.gebdat FROM Mitarbeiter m JOIN Bademeister b on (m.svnr = b.svnr) WHERE NOT EXISTS (SELECT * FROM Mitarbeiter NATURAL JOIN Bademeister WHERE gebdat < m.gebdat);
2.3)
Geben Sie die Sozialversicherungsnummer, den Namen und das Geburtsdatum des aeltesten Bademeisters mit der Ausbildung 'Rettungsschwimmer' aus.
SELECT svnr, name, gebdat FROM Bademeister NATURAL JOIN Mitarbeiter WHERE ausbildung = 'Rettungsschwimmer' AND gebdat <= ALL (SELECT gebdat FROM Bademeister NATURAL JOIN Mitarbeiter WHERE ausbildung = 'Rettungsschwimmer');
SELECT svnr, name, gebdat FROM Bademeister NATURAL JOIN Mitarbeiter WHERE ausbildung = 'Rettungsschwimmer' AND gebdat = (SELECT MIN(gebdat) FROM Bademeister NATURAL JOIN Mitarbeiter WHERE ausbildung = 'Rettungsschwimmer');
SELECT m.svnr, m.name, m.gebdat FROM Mitarbeiter m JOIN Bademeister b on (m.svnr = b.svnr) WHERE b.ausbildung = 'Rettungsschwimmer' AND NOT EXISTS (SELECT * FROM Mitarbeiter NATURAL JOIN Bademeister WHERE ausbildung = 'Rettungsschwimmer' AND gebdat < m.gebdat);
3.1)
Geben Sie eine Liste aller Jahreskartenbesitzer aus, auf der die Kundennummer und der Name des Kunden zusammen mit der laufenden Tagesnummer der Jahreskarte(n) verzeichnet sind.
SELECT k.knr, k.name, j.lfdnr FROM Kunde k JOIN Jahreskarte j ON (k.knr = j.kunde);
3.2)
Geben Sie eine Liste ALLER Kunden (knr, name) aus zusammen mit der laufenden Tagesnummer der Jahreskarte(n), die sie besitzen. Fuer Kunden, die keine Jahreskarte haben, soll stattdessen 'keine Karte' ausgegeben werden.(Stichwort: COALESCE)
SELECT k.knr, k.name, COALESCE(j.lfdnr, 'keine Karte') AS tagesnummer FROM Kunde k LEFT OUTER JOIN Jahreskarte j ON (k.knr = j.kunde);
3.3)
Geben Sie eine Liste ALLER Kunden (knr, name) aus zusammen mit der laufenden Tagesnummer der Jahreskarte(n), die sie besitzen, sowie den Namen des Mitarbeiters, der sie ihnen verkauft hat. Fuer Kunden, die keine Jahreskarte haben, soll anstelle der Tagesnummer 'keine Karte' und anstelle des Namens des Mitarbeiters 'kein Verkaeufer' ausgegeben werden. (Stichwort: COALESCE)
SELECT ku.knr, ku.name, COALESCE(j.lfdnr, 'keine Karte') AS tagesnummer, COALESCE(m.name, 'kein Verkaeufer') AS Verkaeufer FROM Kunde ku LEFT OUTER JOIN Jahreskarte j ON (ku.knr = j.kunde) LEFT OUTER JOIN Karte ka ON (j.lfdnr = ka.lfdnr AND j.von = ka.von) LEFT OUTER JOIN Mitarbeiter m ON (ka.verkaeufer = m.svnr);
SELECT ku.knr, ku.name, COALESCE(j.lfdnr, 'keine Karte') AS tagesnummer, COALESCE(m.name, 'kein Verkaeufer') AS Verkaeufer FROM Mitarbeiter m JOIN Karte ka ON (m.svnr = ka.verkaeufer) JOIN Jahreskarte j ON (j.lfdnr = ka.lfdnr AND j.von = ka.von) RIGHT OUTER JOIN Kunde ku ON (ku.knr = j.kunde);
4.1)
Mit Aussnahme von PH-Wert Bestimmungen (bez = 'pH-Wert'), soll die Bezeichnung, der Wert und der Zeitpunkt aller Messwerte ausgegeben werden, die fuer Nichtschwimmer-Becken (Tiefe maximal 135 cm) erhoben wurden.
SELECT m.bez, m.wert, m.zeitpkt FROM Messwert m JOIN Becken b ON (m.becken = b.bez) WHERE b.tiefe <= 135 AND m.bez != 'pH-Wert';
4.2)
Gesucht ist die Bezeichnung jener Becken, fuer die noch nie ein pH-Wert (Messwert bez = 'pH-Wert') erhoben wurde und die keine Nichtschwimmer-Becken sind. (Die Tiefe betraegt fuer Nichtschwimmerbecken maximal 135 cm.)
SELECT bez FROM Becken WHERE tiefe > 135 AND bez NOT IN (SELECT becken FROM Messwert WHERE bez = 'pH-Wert');
SELECT b.bez FROM Becken b WHERE tiefe > 135 AND NOT EXISTS (SELECT * FROM Messwert m WHERE m.bez = 'pH-Wert' AND m.becken = b.bez);
5.1)
Wieviele verschiedene Kategorien sind den Eintrittskarten mit der laufenden Tagesnummer '123123' zugeordnet?
SELECT COUNT(distinct kategorie) AS Anzahl FROM hat WHERE lfdnr = '123123';
5.2)
Geben Sie fuer ALLE Eintrittskarten die laufende Tagesnummer sowie den Preis aus und dazu die Anzahl der zugeordneten Kategorien.
SELECT k.lfdnr, k.preis, COUNT(h.kategorie) AS Anzahl FROM Karte k LEFT OUTER JOIN hat h ON (k.lfdnr = h.lfdnr AND k.von = h.von) GROUP BY k.lfdnr, k.von, k.preis;
select k.lfdnr, k.preis, (select count(kategorie) from hat where lfdnr=k.lfdnr and von=k.von)as anzahl from karte k;
5.3)
Geben Sie die laufende Tagesnummer sowie den Preis jener Eintrittskarten aus, denen am meisten Kategorien zugeordnet sind.
SELECT lfdnr, preis FROM Karte NATURAL JOIN hat GROUP BY lfdnr, von, preis HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM hat GROUP BY lfdnr, von);
6)
Geben Sie zu jeder Beckentiefe, die Bezeichnung jenes Beckens aus, fuer das die meisten Messwerte vorliegen. Ordnen Sie das Ergebnis aufsteigend nach der Beckentiefe. (Beckentiefen, zu denen es keine Messwerte gibt, brauchen Sie dabei nicht beruecksichtigen.)
SELECT b.tiefe, b.bez FROM Becken b JOIN Messwert m ON (b.bez = m.becken) GROUP BY b.tiefe, b.bez HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM becken b1 JOIN Messwert m1 ON (b1.bez = m1.becken) WHERE b1.tiefe = b.tiefe GROUP BY b1.bez) ORDER BY b.tiefe asc;
7)
Gesucht ist der Name und das Geburtsdatum jenes Bademeisters der bereits Rettungsdienste in ALLEN Becken mit der Tiefe von 260cm uebernommen hat, aber erst weniger als drei Massnahmen durchgefuehrt hat.
SELECT name, gebdat FROM Mitarbeiter WHERE svnr IN (SELECT r.bademeister FROM RDienst r JOIN Becken b ON (r.becken = b.bez) WHERE b.tiefe = 260 GROUP BY bademeister HAVING COUNT(distinct b.bez) = (SELECT COUNT(*) FROM Becken WHERE tiefe = 260)) AND svnr NOT IN (SELECT bademeister FROM Massnahme GROUP BY bademeister HAVING COUNT(*) >= 3);
select name, gebdat from mitarbeiter m where not exists (select bez from becken where tiefe = 260 and bez not in (select becken from rdienst where bademeister = m.svnr)) and (select count(*) from massnahme where bademeister = m.svnr) < 3
8)
Wieviele Messwerte werden pro Becken durchschnittlich erhoben?
SELECT AVG(a.anz) AS durchschnitt FROM (SELECT COUNT(m.zeitpkt) AS anz FROM Becken b LEFT OUTER JOIN Messwert m ON (b.bez = m.becken) GROUP BY b.bez) a;
9)
Geben Sie die Bezeichnung und Tiefe jener Becken aus, fuer die bereits alle verschiedenen Messwerte (z.B. Clor, pH-Wert, etc.) erhoben wurden.
SELECT b.bez, b.tiefe FROM Becken b JOIN Messwert m ON (b.bez = m.becken) GROUP BY b.bez, b.tiefe HAVING COUNT(DISTINCT m.bez) = (SELECT COUNT(DISTINCT bez) FROM Messwert);
SELECT b.bez, b.tiefe FROM Becken b WHERE not exists (select * from messwert where bez not in (select bez from messwert m where m.becken=b.bez));
10)
Geben Sie eine Liste ALLER Kategorien (Bezeichnung und Beschreibung) aus und dazu die Anzahl der seit dem '01.01.2011' verkauften Eintrittskarten und wieviel diese in Summe gekostet haben. Verwenden Sie dazu die Funktion TO_DATE und folgendes Datumsformat: DD-MM-YYYY.
SELECT k.bez, k.beschreibung, coalesce(x.anz, 0) AS Anzahl, coalesce(x.gespreis, 0) AS Gesamtpreis FROM Kategorie k LEFT OUTER JOIN (SELECT kategorie, COUNT(*) as anz, SUM(preis) as gespreis FROM hat NATURAL JOIN Karte WHERE von >= TO_DATE('01-01-2011', 'DD-MM-YYYY') GROUP BY kategorie) x ON (k.bez = x.kategorie);
select bez, beschreibung, count(karte.lfdnr) as anzahl, coalesce(sum(preis), 0) as gesamtpreis from kategorie left join (hat join karte on (hat.lfdnr=karte.lfdnr and hat.von=karte.von and karte.von >= TO_DATE('01-01-2011', 'DD-MM-YYYY'))) on kategorie.bez=hat.kategorie group by bez, beschreibung;