Eventmanager - Die Datenbank

Ein Eventmanager benötigt zur Verwaltung eine Datenbank.

Beschreibung der Datenbank

Eine Veranstaltung wird über eine ID (VID) identifiziert. Sie besitzt eine Bezeichnung (BEZ), sowie eine Beschreibung (BESCHREIBUNG) und eine Dauer (DAUER). Filme sind eine Spezialisierung von Veranstaltungen. Ein Film ist einem Genre (GENRE) zugeordnet, außerdem werden auch noch der Regisseur (REGISSEUR) und die Altersgrenze (FSK) vermerkt. Eine Veranstaltung kann in genau einem Saal stattfinden, wobei in einem Saal mehrere Veranstaltungen stattfinden können. Es wird auch der jeweilige Veranstaltungsbeginn (VON) und das Ende (BIS) vermerkt. Eine Veranstaltung kann also in einem Saal auch zu verschiedenen Zeitpunkten stattfinden. Ein Saal wird über seine Saalnummer (SNR) identifiziert. Zusätzlich wird auch noch eine Bezeichnung (BEZ) zu dem Saal vermerkt. Eine Reihe ist genau einem Saal zugeordnet und kann innerhalb dieses Saales über eine Reihennummer (RNR) eindeutig identifiziert werden. Reihen bestehen aus einer beliebigen Anzahl von Plätzen mit einer je Reihe und Saal eindeutigen Platznummer. Eine Kategorie wird über eine ID (KID) eindeutig identifiziert. Zusätzlich werden noch eine Bezeichnung (BEZ) sowie der Preis (PREIS) der Kategorie gespeichert. Eine Reihe ist nun genau einer Kategorie zugeordnet, wobei eine Kategorie aber beliebig vielen Reihen zugeordnet sein kann. Ein Veranstaltungsort wird über eine ID eindeutig identifiziert (VONR). Außerdem wird noch die Bezeichnung (BEZ) vermerkt. Ein Veranstaltungsort umfasst mehrere Säle. In jedem Veranstaltungsort können beliebig viele Merchandiseartikel zu einer bestimmten Stückzahl (LAGERSTAND) angeboten werden, wobei Merchandiseartikel auch in beliebig vielen Veranstaltungsorten angeboten werden können. Ein Merchandiseartikel wird über seinen Hersteller (HERSTELLER) in Kombination mit seiner Bezeichnung (BEZ) eindeutig identifiziert. Zusätzlich wird zu ihm auch noch der Verkaufspreis (PREIS) vermerkt. Ein Merchandiseartikel wirbt für genau eine Veranstaltung, wobei für eine Veranstaltung mittels beliebig vielen Artikeln Merchandising betrieben werden kann. Ein Ticket wird in dem System über eine fortlaufende Ticketnummer (TNR) identifiziert. Ein Ticket umfasst immer genau einen Platz einer bestimmten Veranstaltung. Tickets können von einem Kunden reserviert werden, wobei ein Kunde beliebig viele Tickets reservieren kann. Außerdem wird auch der Zeitpunkt (ZEITPUNKT) der Reservierung erfasst. Ein Kunde wird über eine fortlaufende Kundenummer (KNR) eindeutig im System identifiziert. Zusätzlich wird auch noch der Nachname (NNAME) des Kunden gespeichert. Das System erfasst außerdem noch Premiumkunden. Ein Permiumkunde besitzt zusätzlich noch einen Vornamen (VNAME), ein Geburtsdatum (GEBDAT), eine Telefonnummer (TELEFON) sowie ein Geschlecht (GESCHLECHT). Dazu werden noch seine Adressdaten (ADRESSE) in nicht näher spezifizierter Weise vermerkt. Weiters werden auch noch seine E-Mail-Adresse (EMAIL) und sein Passwort (PASSWORT) für den Onlineaccount gespeichert. Premiumkunden können Merchandiseartikel zu beliebiger Stückzahl kaufen. Ein Premiumkunde kann dabei beliebig viele Merchandiseartikel kaufen und ein Merchandiseartikel kann von beliebig vielen Premiumkunden gekauft werden. Die Datenbank umfasst außerdem noch die Mitarbeiter. Ein Mitarbeiter wird über seine Sozialversicherungsnummer (SVNR) eindeutig identifiziert. Außerdem werden noch Vorname (VNAME) und Nachname (NNAME) vermerkt. Ein Veranstaltungsort wird immer von genau einem Mitarbeiter geleitet. Außerdem können in einem Veranstaltungsort beliebig viele Mitarbeiter arbeiten. Es wird auch die Arbeitsfunktion (FUNKTION) und das Gehalt (GEHALT) des Mitarbeiters für seine Arbeitsstellen vermerkt.


1:

Geben Sie die Veranstaltungs-ID, die Bezeichnung und die Beschreibung aller Veranstaltungen aus.

		
			SELECT vid, bez, beschreibung
			FROM Veranstaltung;	
	
		


2:

Geben Sie die Veranstaltungs-ID, den Regisseur, die Bezeichnung und die Beschreibung aller Filme aus. Sortieren Sie das Ergebnis alphabetisch absteigend nach der Bezeichnung.

		
			SELECT vid, regisseur, bez, beschreibung
			FROM Veranstaltung NATURAL JOIN FILM
			ORDER BY bez DESC;	
	
		


3:

Geben Sie die Bezeichnung derjenigen Filme aus, deren Regisseur 'Hitchcock' ist. Vermeiden Sie dabei, dass eine Bezeichnung doppelt angefuehrt wird.

		
			SELECT DISTINCT bez
			FROM Veranstaltung NATURAL JOIN Film
			WHERE regisseur = 'Hitchcock';	
	
		


4:

Geben Sie die Kundennummer, das Geburtsdatum und die E-Mail-Adresse aller weiblichen Premiumkunden aus, die seit dem 1.1.1980 geboren wurden. Verwenden Sie dazu die Funktion TO_DATE und folgendes Datumsformat: DD-MM-YYYY.

		
			select KNR, GEBDAT, EMAIL
			from PREMIUMKUNDE
			where GEBDAT >= TO_DATE('01-01-1980', 'DD-MM-YYYY') AND GESCHLECHT = 'weiblich';	
	
		


5:

Geben Sie die Bezeichnung jener Säle aus, die zumindest eine Reihe umfassen, welche in die Kategorie 'VIP' fällt. Vermeiden Sie doppelte Eintraege.

		
			SELECT DISTINCT s.bez
			FROM Saal s NATURAL JOIN Reihe r JOIN Kategorie k ON(r.kategorie = k.kid)
			WHERE k.bez = 'VIP';	
	
		

		
			SELECT DISTINCT s.bez
			FROM Saal s
			WHERE EXISTS (SELECT * FROM Reihe r JOIN Kategorie k ON (r.kategorie = k.kid AND k.bez = 'VIP') WHERE s.snr = r.snr);	
	
		


6.1:

Geben Sie die SVNR, den Vornamen und den Nachnamen jener Mitarbeiter aus, die an einem Veranstaltungsort arbeiten, zusammen mit der Veranstaltungsort-ID.

		
			SELECT svnr, vname, nname, veranstaltungsort AS arbeitet_in
			FROM Mitarbeiter JOIN arbeitet ON (svnr = mitarbeiter);	
	
		


6.2:

Geben Sie die SVNR, den Vornamen und den Nachnamen ALLER Mitarbeiter zusammen mit der Veranstaltungsort-ID des Veranstaltungsortes aus, in welchem sie arbeiten. Für Mitarbeiter, die in keinem Veranstaltungsort arbeiten soll die Zahl '0' ausgegeben werden. (Stichwort: COALESCE).

		
			SELECT svnr, vname, nname, COALESCE(veranstaltungsort, 0) AS arbeitet_in
			FROM Mitarbeiter LEFT OUTER JOIN arbeitet ON (svnr = mitarbeiter);	
	
		


6.3:

Geben Sie die SVNR, den Vornamen und den Nachnamen ALLER Mitarbeiter zusammen mit der Bezeichnung des Veranstaltungsortes aus, in welchem sie arbeiten. Für Mitarbeiter, die in keinem Veranstaltungsort arbeiten soll 'keine Zuteilung' ausgegeben werden. (Stichwort: COALESCE).

		
			SELECT svnr, vname, nname, COALESCE(bez, 'keine Zuteilung') AS arbeitet_in
			FROM Mitarbeiter LEFT OUTER JOIN
			(arbeitet JOIN Veranstaltungsort ON(veranstaltungsort = VONR))
			ON (svnr = mitarbeiter);	
	
		


7.1:

Geben Sie das Geburtsdatum des jüngsten Premiumkunden aus.

		
			SELECT MAX(gebdat) AS gebdat
			FROM Premiumkunde;	
	
		


7.2:

Geben Sie den Vornamen, das Geburtsdatum und das Geschlecht der jüngsten Premiumkunden aus.

		
			SELECT vname, gebdat, geschlecht
			FROM Premiumkunde
			WHERE gebdat = (SELECT MAX(gebdat) FROM Premiumkunde);	
	
		

		
			SELECT vname, gebdat, geschlecht
			FROM Premiumkunde
			WHERE gebdat >= ALL (SELECT gebdat FROM Premiumkunde);	
	
		

		
			SELECT p.vname, p.gebdat, p.geschlecht
			FROM Premiumkunde p
			WHERE NOT EXISTS (SELECT * FROM Premiumkunde WHERE gebdat > p.gebdat);	
	
		


7.3:

Geben Sie den Vornamen, das Geburtsdatum und das Geschlecht sowie die Reservierungen (Ticketnummer, Zeitpunkt) der jüngsten weiblichen Premiumkunden aus.

		
			SELECT vname, gebdat, geschlecht, ticket, zeitpunkt
			FROM Premiumkunde JOIN reserviert ON (knr = kunde)
			WHERE geschlecht = 'weiblich'
			AND gebdat = (SELECT MAX(gebdat) FROM Premiumkunde WHERE geschlecht = 'weiblich');	
	
		

		
			SELECT vname, gebdat, geschlecht, ticket, zeitpunkt
			FROM Premiumkunde JOIN reserviert ON (knr = kunde)
			WHERE geschlecht = 'weiblich'
			AND gebdat >= ALL (SELECT gebdat FROM Premiumkunde WHERE geschlecht = 'weiblich');	
	
		

		
			SELECT p.vname, p.gebdat, p.geschlecht, r.ticket, r.zeitpunkt
			FROM Premiumkunde p JOIN reserviert r ON (p.knr = r.kunde)
			WHERE p.geschlecht = 'weiblich'
			AND NOT EXISTS (SELECT * FROM Premiumkunde WHERE gebdat > p.gebdat AND geschlecht = 'weiblich');	
	
		


8:

Geben Sie eine Liste ALLER Kunden (knr und Name) aus zusammen mit dem Reservierungsdatum jener Tickets, die ab dem 02-12-2010 reserviert wurden. Hat ein Kunde ab dem 02-12-2010 kein Ticket reserviert, so geben Sie 'kein Ticket in dem Zeitraum' aus. Verwenden Sie dazu folgendes Datumsformat: DD-MM-YYYY (Hinweis: Sie werden dabei die Funktion TO_CHAR brauchen).

		
			select knr, nname, 
			 coalesce(TO_CHAR(zeitpunkt, 'DD-MM-YYYY' ), 'kein Ticket in dem Zeitraum') as reservierung 
			 from kunde left outer join reserviert on (knr=kunde and zeitpunkt>=TO_DATE('02-12-2010', 'DD-MM-YYYY'));	
	
		


9.1:

Wieviele Mitarbeiter arbeiten im Veranstaltungsort mit der Veranstaltungsort-ID 1?

		
			SELECT count(*) AS anzahl_mitarbeiter
			FROM arbeitet
			WHERE veranstaltungsort = 1;	
	
		


9.2:

Geben Sie ALLE Mitarbeiter (Vorname, Nachname) zusammen mit der Anzahl ihrer Arbeitsstellen aus. Sortieren Sie das Ergebnis zuerst absteigend nach der Anzahl der Arbeitsstellen und anschliessend aufsteigend nach Nachname und Vorname. (Eine Arbeitsstelle entspricht dabei einem Veranstaltungsort, in dem der Mitarbeiter arbeitet.)

		
			SELECT vname, nname, count(mitarbeiter) as anzahl_anstellungen
			FROM Mitarbeiter LEFT OUTER JOIN arbeitet ON(svnr = mitarbeiter)
			GROUP BY svnr, vname, nname
			ORDER BY anzahl_anstellungen DESC, nname, vname;	
	
		


9.3:

Geben Sie SVNR, Vornamen und Nachnamen jener Mitarbeiter aus, die die meisten Arbeitsstellen haben.

		
			SELECT svnr, vname, nname
			FROM Mitarbeiter JOIN arbeitet ON(svnr = mitarbeiter)
			GROUP BY svnr, vname, nname
			HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM arbeitet GROUP BY mitarbeiter);	
	
		

		
			SELECT svnr, vname, nname
			FROM Mitarbeiter JOIN arbeitet ON(svnr = mitarbeiter)
			GROUP BY svnr, vname, nname
			HAVING COUNT(*) = (SELECT MAX(anz)
			                   FROM (SELECT COUNT(*) AS anz
			                         FROM arbeitet GROUP BY mitarbeiter));	
	
		


10:

Geben Sie zu jedem Veranstaltungsort (ID, Bezeichnung), in dem mehr als 4 Mitarbeiter tätig sind, die Summe der Gehälter aus.

		
			SELECT VONR, bez, SUM(gehalt) AS gehaelter_sum
			FROM Veranstaltungsort JOIN arbeitet ON(VONR = veranstaltungsort)
			GROUP BY VONR, bez
			HAVING COUNT(mitarbeiter) > 4;	
	
		


11.1:

Gesucht sind jene Filme (Regisseur, Genre, FSK), die kürzer als 120 Minuten sind und die erst ab 12 oder mehr Jahren zugelassen sind.

		
			SELECT regisseur, genre, fsk
			FROM Film
			WHERE vid IN(SELECT vid FROM Veranstaltung WHERE dauer < 120) AND FSK >= 12;	
	
		

		
			SELECT regisseur, genre, fsk
			FROM Film NATURAL JOIN Veranstaltung
			WHERE dauer < 120 AND FSK >= 12;	
	
		


11.2:

Gesucht sind jene Filme (Regisseur, Genre, FSK), die kürzer als 120 Minuten sind und für welche kein Merchandiseartikel wirbt.

		
			SELECT regisseur, genre, fsk
			FROM Film
			WHERE vid IN(SELECT vid FROM Veranstaltung WHERE dauer < 120)
			AND vid NOT IN(SELECT wirbt_fuer FROM Merchandiseartikel);	
	
		

		
			SELECT regisseur, genre, fsk
			FROM Film NATURAL JOIN Veranstaltung
			WHERE dauer < 120
			AND vid NOT IN(SELECT wirbt_fuer
			               FROM Merchandiseartikel);	
	
		

		
			SELECT f.regisseur, f.genre, f.fsk
			FROM Film f
			WHERE EXISTS (SELECT *
			             FROM Veranstaltung v
			             WHERE v.dauer < 120 AND v.vid = f.vid)
			             AND NOT EXISTS (SELECT *
			                             FROM Merchandiseartikel
			                             WHERE wirbt_fuer = f.vid);	
	
		


11.3:

Gesucht sind jene Filme (Regisseur, Genre, FSK), die kürzer als 120 Minuten sind und für welchen nur Merchandiseartikel vom Hersteller 'HisMark' werben.

		
			SELECT regisseur, genre, fsk
			FROM Film
			WHERE vid IN (SELECT vid FROM Veranstaltung WHERE dauer < 120)
			AND vid IN (SELECT wirbt_fuer FROM Merchandiseartikel)
			AND vid NOT IN (SELECT wirbt_fuer FROM Merchandiseartikel WHERE hersteller != 'HisMark');	
	
		

		
			SELECT regisseur, genre, fsk
			FROM Film NATURAL JOIN Veranstaltung
			WHERE dauer < 120
			AND vid IN (SELECT wirbt_fuer FROM Merchandiseartikel)
			AND vid NOT IN(SELECT wirbt_fuer FROM Merchandiseartikel WHERE hersteller != 'HisMark');	
	
		

		
			SELECT f.regisseur, f.genre, f.fsk
			FROM Film f
			WHERE EXISTS (SELECT * FROM Veranstaltung v WHERE v.dauer < 120 AND v.vid = f.vid)
			AND EXISTS (SELECT * FROM Merchandiseartikel WHERE wirbt_fuer = f.vid)
			AND NOT EXISTS (SELECT * FROM Merchandiseartikel WHERE wirbt_fuer = f.vid AND hersteller != 'HisMark');	
	
		

		
			(SELECT regisseur, genre, fsk
			FROM film f join (veranstaltung v join merchandiseartikel m on (v.vid=m.wirbt_fuer)) on (f.vid=v.vid)
			where dauer < 120)
			minus
			(SELECT regisseur, genre, fsk
			FROM film f join (veranstaltung v join merchandiseartikel m on (v.vid=m.wirbt_fuer)) on (f.vid=v.vid)
			WHERE hersteller !='HisMark')	
	
		


12:

Gesucht sind jene Mitarbeiter (SVNR, Vorname, Nachname), die in allen Veranstaltungsorten arbeiten, aber in Summe nicht mehr als 8000 Euro verdienen.

		
			SELECT svnr, vname, nname
			FROM Mitarbeiter JOIN arbeitet ON(svnr = mitarbeiter)
			GROUP BY svnr, vname, nname
			HAVING COUNT(*) = (SELECT COUNT(*)
			                   FROM Veranstaltungsort)
			                   AND SUM(gehalt) <= 8000;	
	
		

		
			SELECT svnr, vname, nname
			FROM Mitarbeiter JOIN arbeitet ON(svnr = mitarbeiter)
			WHERE NOT EXISTS (
			                SELECT *
			                FROM Veranstaltungsort
			                WHERE VONR NOT IN(
			                        SELECT veranstaltungsort
			                        FROM arbeitet
			                        WHERE mitarbeiter = svnr))
			GROUP BY svnr, vname, nname
			HAVING SUM(gehalt) <= 8000;	
	
		

		
			SELECT svnr, vname, nname
			FROM Mitarbeiter JOIN arbeitet ON (svnr = mitarbeiter)
			WHERE NOT EXISTS (
			    SELECT *
			    FROM Veranstaltungsort
			    WHERE NOT EXISTS (
			        SELECT *
			        FROM arbeitet
			        WHERE veranstaltungsort = vonr AND mitarbeiter = svnr))
			GROUP BY svnr, vname, nname
			HAVING sum(gehalt) <= 8000;	
	
		


13:

Geben Sie für jeden Hersteller die Merchandiseartikel (Hersteller, Bezeichnung, Preis) aus, die in Summe am häufigsten lagernd sind. Berücksichtigen Sie dabei alle Veranstaltungsorte.

		
			SELECT m.hersteller, m.bez, m.preis
			FROM Merchandiseartikel m JOIN bietet_an b ON (m.hersteller = b.hersteller AND m.bez = b.bez)
			GROUP BY m.hersteller, m.bez, m.preis
			HAVING SUM(b.lagerstand) >= ALL( SELECT SUM(b1.lagerstand)
			                                FROM bietet_an b1
			                                WHERE m.hersteller = b1.hersteller
			                                GROUP BY b1.hersteller, b1.bez);	
	
		


14:

Geben Sie eine Liste ALLER Veranstaltungen aus (VID, Bez, Dauer) und vermerken Sie in einer zusätzlichen Spalte: a) 'keine Werbeartikel', falls für die Veranstaltung kein Merchandiseartikel wirbt, b) 'ein Werbeartikel', falls für die Veranstaltung genau ein Merchandiseartikel wirbt und c) 'mehrere Werbeartikel', falls für die Veranstaltung mehrere Merchandiseartikel werben.

		
			SELECT v.vid, v.bez, v.dauer, 'keine Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE NOT EXISTS (SELECT * FROM Merchandiseartikel m WHERE m.wirbt_fuer = v.vid)
			UNION
			SELECT v.vid, v.bez, v.dauer, 'ein Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE EXISTS (
			    SELECT m.wirbt_fuer
			    FROM Merchandiseartikel m
			    WHERE m.wirbt_fuer = v.vid
			    GROUP BY m.wirbt_fuer
			    HAVING COUNT(m.wirbt_fuer) = 1)
			UNION
			SELECT v.vid, v.bez, v.dauer, 'mehrere Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE EXISTS (
			    SELECT m.wirbt_fuer
			    FROM Merchandiseartikel m
			    WHERE m.wirbt_fuer = v.vid
			    GROUP BY m.wirbt_fuer
			    HAVING COUNT(m.wirbt_fuer) > 1)	
	
		

		
			SELECT v.vid, v.bez, v.dauer, 'keine Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE 0 = (SELECT COUNT(*)
			           FROM Merchandiseartikel m
			           WHERE m.wirbt_fuer = v.vid)
			UNION
			SELECT v.vid, v.bez, v.dauer, 'ein Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE 1 = (SELECT COUNT(*)
			           FROM Merchandiseartikel m
			           WHERE m.wirbt_fuer = v.vid)
			UNION
			SELECT v.vid, v.bez, v.dauer, 'mehrere Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE 1 < ( SELECT COUNT(*)
			            FROM Merchandiseartikel m
			            WHERE m.wirbt_fuer = v.vid);	
	
		

		
			SELECT v.vid, v.bez, v.dauer, 'keine Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE v.vid NOT IN (SELECT wirbt_fuer FROM Merchandiseartikel m WHERE m.wirbt_fuer = v.vid)
			UNION
			SELECT v.vid, v.bez, v.dauer, 'ein Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE v.vid IN (
			    SELECT m.wirbt_fuer
			    FROM Merchandiseartikel m
			    WHERE m.wirbt_fuer = v.vid
			    GROUP BY m.wirbt_fuer
			    HAVING COUNT(m.wirbt_fuer) = 1)
			UNION
			SELECT v.vid, v.bez, v.dauer, 'mehrere Werbeartikel' AS werbung
			FROM Veranstaltung v
			WHERE v.vid IN (
			    SELECT m.wirbt_fuer
			    FROM Merchandiseartikel m
			    WHERE m.wirbt_fuer = v.vid
			    GROUP BY m.wirbt_fuer
			    HAVING COUNT(m.wirbt_fuer) > 1)	
	
		


15:

Geben Sie ALLE Veranstaltungsorte aus (VONR, Bezeichnung) und dazu die Anzahl der verschiedenen Merchandiseartikel, welche diese vom Hersteller 'MyMark' anbieten.

		
			SELECT v.VONR, v.bez, (
			SELECT COUNT(*)
			FROM bietet_an b
			WHERE b.veranstaltungsort = v.VONR AND hersteller = 'MyMark') AS anz_artikel
			FROM Veranstaltungsort v;	
	
		

		
			SELECT v.vonr, v.bez, COUNT(b.bez) AS anz
			FROM Veranstaltungsort v LEFT OUTER JOIN bietet_an b ON (v.vonr = b.veranstaltungsort AND b.hersteller = 'MyMark')
			GROUP BY v.vonr, v.bez;	
	
		


16:

Um wieviel kosten die Merchandiseartikel, die am Veranstaltungsort 1 angeboten werden durchschnittlich mehr als die anderer Veranstaltungsorte?

		
			SELECT a.preis - b.preis AS preis_differenz 
			 FROM (SELECT AVG(preis) AS preis 
			      FROM Merchandiseartikel NATURAL JOIN bietet_an 
			      WHERE veranstaltungsort = 1) a, 
			     (SELECT AVG(subpreis) AS preis 
			      FROM (SELECT AVG(preis) AS subpreis 
			      FROM Merchandiseartikel NATURAL JOIN bietet_an 
			      WHERE veranstaltungsort != 1 
			      GROUP BY veranstaltungsort)) b;	
	
		


17:

Geben Sie eine Liste aller Veranstaltungsorte (VONR, Bezeichnung) zusammen mit der Anzahl der angebotenen Merchandiseartikel, der zugeordneten Säle und der dort arbeitenden Mitarbeiter aus.

		
			SELECT v.VONR, v.bez, COALESCE(me.anz, 0) AS anz_merchandiseartikel, 
			COALESCE(s.anz, 0) AS anz_säle, COALESCE(mi.anz, 0) AS anz_mitarbeiter
			FROM Veranstaltungsort v LEFT OUTER JOIN (SELECT COUNT(*) AS anz, veranstaltungsort
			                                                FROM bietet_an
			                                                GROUP BY veranstaltungsort) me ON(v.VONR = me.veranstaltungsort)
			LEFT OUTER JOIN (SELECT COUNT(*) AS anz, veranstaltungsort
			                 FROM Saal
			                 GROUP BY veranstaltungsort) s ON(v.VONR = s.veranstaltungsort)
			LEFT OUTER JOIN (SELECT COUNT(*) AS anz, veranstaltungsort
			                 FROM arbeitet
			                 GROUP BY veranstaltungsort) mi ON(v.VONR = mi.veranstaltungsort);	
	
		

		
			SELECT v.VONR, v.bez, (
			    SELECT COUNT(*)
			    FROM bietet_an b
			    WHERE b.veranstaltungsort = v.VONR) AS anz_merchandiseartikel, (
			    SELECT COUNT(*)
			    FROM Saal s
			    WHERE s.veranstaltungsort = v.VONR) AS anz_säle, (
			    SELECT COUNT(*)
			    FROM arbeitet a
			    WHERE a.veranstaltungsort = v.VONR) AS anz_mitarbeiter
			FROM Veranstaltungsort v;	
	
		


18:

Gesucht sind jene Mitarbeiter (SVNR, Vorname, Nachname), die einen Veranstaltungsort leiten, dem auch mindestens 25 Prozent der Merchandiseartikel mit einem Preis größer 30 Euro zugeordnet sind.

		
			SELECT svnr, vname, nname
			FROM Veranstaltungsort JOIN Mitarbeiter ON(leiter = svnr)
			WHERE VONR IN (SELECT veranstaltungsort
			               FROM bietet_an NATURAL JOIN Merchandiseartikel
			               WHERE preis > 30
			               GROUP BY veranstaltungsort
			               HAVING COUNT(*) >= (SELECT COUNT(*) * 0.25
			                                   FROM bietet_an NATURAL JOIN Merchandiseartikel
			                                   WHERE preis > 30));	
	
		

		
			SELECT svnr, vname, nname
			FROM Veranstaltungsort JOIN Mitarbeiter ON(leiter = svnr)
			WHERE VONR IN (SELECT veranstaltungsort
			               FROM bietet_an NATURAL JOIN Merchandiseartikel
			               WHERE preis > 30
			               GROUP BY veranstaltungsort
			               HAVING COUNT(*) >= (SELECT COUNT(*) /4
			                                   FROM bietet_an NATURAL JOIN Merchandiseartikel
			                                   WHERE preis > 30));	
	
		


19:

Welche Veranstaltungen (VID, Bezeichnung, Dauer) dauern länger als der längste Film?

		
			SELECT vid, bez, dauer
			FROM Veranstaltung
			WHERE dauer > (SELECT MAX(dauer) FROM Film NATURAL JOIN Veranstaltung);	
	
		


20:

Gesucht sind jene Veranstaltungen (VID, Bezeichnung), für die Merchandiseartikel vom Hersteller 'MyMark' und/oder 'YourMark', aber keine vom Hersteller 'HisMark' und/oder 'HerMark' werben.

		
			SELECT DISTINCT v.vid, v.bez
			FROM Veranstaltung v JOIN Merchandiseartikel m ON(v.vid = m.wirbt_fuer)
			WHERE (m.hersteller = 'MyMark' OR m.hersteller = 'YourMark')
			AND v.vid NOT IN(SELECT m1.wirbt_fuer
			                 FROM Merchandiseartikel m1
			                 WHERE m1.wirbt_fuer = v.vid
			                 AND (m1.hersteller = 'HisMark' OR m1.hersteller = 'HerMark'));	
	
		


21:

Geben Sie die Veranstaltungen (VID, Bezeichnung, Dauer) aus, für welche ein Merchandiseartikel wirbt, der in mindestens 3 verschiedenen Veranstaltungsorten angeboten wird.

		
			SELECT vid, bez, dauer
			FROM Veranstaltung
			WHERE vid IN (SELECT wirbt_fuer
			              FROM bietet_an NATURAL JOIN Merchandiseartikel
			              GROUP BY hersteller, bez, wirbt_fuer
			              HAVING COUNT(veranstaltungsort) >= 3);	
	
		


22:

Bei welchen schlecht bezahlten Mitarbeitern (Durchschnittsgehalt gemittelt über alle Arbeitsstellen kleiner als 1000 Euro) ist die Anzahl ihrer Arbeitsstellen, am höchsten? Geben Sie die SVNR, den Vornamen und den Nachnamen der Mitarbeiter sowie ihr Durchschnittsgehalt und die Anzahl ihrer Arbeitsstellen aus. Eine Arbeitsstelle entspricht dabei einem Veranstaltungsort, in dem der Mitarbeiter arbeitet.

		
			SELECT svnr, vname, nname, AVG(gehalt) AS gehalt_sum, 
			COUNT(veranstaltungsort) AS anzahl_arbeitsstellen
			FROM Mitarbeiter JOIN arbeitet ON (svnr = mitarbeiter)
			GROUP BY svnr, vname, nname
			HAVING AVG(gehalt) < 1000
			AND COUNT(veranstaltungsort) >= ALL (SELECT COUNT(veranstaltungsort)
			                                        FROM Mitarbeiter JOIN arbeitet ON(svnr = mitarbeiter)
			                                        GROUP BY svnr
			                                        HAVING AVG(gehalt) < 1000);	
	
		


23:

Geben Sie eine Liste ALLER Merchandiseartikel (Hersteller, Bezeichnung, Preis) aus und dazu, wie viele andere Merchandiseartikel teurer sind, wie viele andere Merchandiseartikel billiger sind und wie viele ANDERE Merchandiseartikel den gleichen Preis haben.

		
			SELECT m.hersteller, m.bez, m.preis, (
			SELECT COUNT(*)
			FROM Merchandiseartikel m1
			WHERE m1.preis > m.preis) AS anz_teurere_artikel, (
			SELECT COUNT(*)
			FROM Merchandiseartikel m1
			WHERE m1.preis < m.preis) AS anz_billigere_artikel, (
			SELECT COUNT(*) - 1
			FROM Merchandiseartikel m1
			WHERE m1.preis = m.preis) AS anz_gleich_artikel
			FROM Merchandiseartikel m;	
	
		

		
			SELECT m.hersteller, m.bez, m.preis,
			(SELECT count(*) 
			 FROM merchandiseartikel WHERE preis > m.preis) AS anz_teurer,
			(SELECT count(*) 
			 FROM merchandiseartikel WHERE preis < m.preis) AS anz_billiger,
			(SELECT count(*) 
			 FROM merchandiseartikel WHERE NOT (hersteller = m.hersteller AND bez = m.bez) AND preis = m.preis) AS anz_gleich_andere
			FROM merchandiseartikel m;	
	
		


24:

Geben Sie eine Liste ALLER Kunden (KNR, Nachname) und dazu den Zeitpunkt und die Bezeichnung der Veranstaltung für das von ihnen zuletzt reservierte Ticket aus. Wenn ein Kunde noch keine Reservierung getätigt hat, soll in den Spalten für den Zeitpunkt und die Bezeichnung der Text 'keine Reservierung vorhanden' aufscheinen. Verwenden Sie die Funktion TO_CHAR um den Zeitpunkt mittels dem Format 'DD-MM-YYYY HH24:MM:SS' in eine Zeichenkette umzuwandeln.

		
			SELECT k.knr, k.nname, 
			COALESCE(TO_CHAR(r.zeitpunkt, 'DD-MM-YYYY HH24:MM:SS'),
			'keine Reservierung vorhanden') AS zeitpunkt,
			COALESCE(v.bez, 'keine Reservierung vorhanden') AS veranstaltung
			FROM Kunde k LEFT OUTER JOIN reserviert r ON(k.knr = r.kunde)
			LEFT OUTER JOIN Ticket t ON(r.ticket = t.tnr)
			LEFT OUTER JOIN Veranstaltung v ON(t.veranstaltung = v.vid)
			WHERE r.zeitpunkt >= ALL(
			SELECT r1.zeitpunkt
			FROM reserviert r1
			WHERE r1.kunde = k.knr);	
	
		


25:

Geben Sie alle Premiumkunden (KNR, Vorname, Nachname) aus, die alle Merchandiseartikel vom Hersteller 'MyMark' gekauft haben.

		
			SELECT knr, vname, nname
			FROM Premiumkunde NATURAL JOIN Kunde JOIN kauft ON(knr = kunde AND hersteller = 'MyMark')
			GROUP BY knr, vname, nname
			HAVING COUNT(*) = (SELECT COUNT(*) From Merchandiseartikel WHERE hersteller = 'MyMark');	
	
		

		
			select p.knr, p.vname, k.nname
			from premiumkunde p join kunde k on (p.knr=k.knr)
			where not exists (select *
			                 from merchandiseartikel
			                 where hersteller='MyMark'
			                 and(hersteller, bez) not in(select hersteller, bez
			                                               from kauft
			                                               where kunde=p.knr));