DROP VIEW IF EXISTS v_Film;
CREATE VIEW v_Film AS
  SELECT
    Film.*,
    GROUP_CONCAT(CONCAT_WS(' ', Schauspieler.Vorname, Schauspieler.Nachname) SEPARATOR ', ') AS SchauspielerListe
  FROM Film
  LEFT JOIN nm_Film_Schauspieler ON Film.ID = nm_Film_Schauspieler.fk_Film_ID
  LEFT JOIN Schauspieler ON nm_Film_Schauspieler.fk_Schauspieler_ID = Schauspieler.ID
  GROUP BY Film.ID
  ORDER BY Film.Name ASC, Film.Bewertung DESC
;

DROP VIEW IF EXISTS v_Saal;
CREATE VIEW v_Saal AS
  SELECT
    Saal.ID, Saal.Name, Saal.Beschreibung,
    COUNT(Sitzplatz.ID) Sitzanzahl
  FROM Saal
  LEFT JOIN Sitzplatz ON Saal.ID = Sitzplatz.fk_Saal_ID
  GROUP BY Saal.ID, Saal.Name, Saal.Beschreibung
  ORDER BY Saal.Name
;

DROP VIEW IF EXISTS v_Vorstellung;
CREATE VIEW v_Vorstellung AS
  SELECT
    Vorstellung.ID,
    Vorstellung.Beginn,
    DATE_ADD(Vorstellung.Beginn, INTERVAL v_Film.Spieldauer MINUTE) Ende,
    v_Film.Name Filmname,
    v_Film.Beschreibung,
    v_Film.Bewertung,
    v_Film.SchauspielerListe,
    v_Saal.Name Saalname,
    COUNT(DISTINCT Reservierung.ID) Reservierungen,
    COUNT(Sitzplatz.ID) Platzreservierungen,
    CAST(COUNT(Sitzplatz.ID)/v_Saal.Sitzanzahl AS DECIMAL(5, 4)) Ausbuchung,
    COALESCE(SUM(Sitzplatz.Preis), 0) `Einnahmen`
  FROM Vorstellung
  JOIN v_Film ON Vorstellung.fk_Film_ID=v_Film.ID
  JOIN v_Saal ON Vorstellung.fk_Saal_ID = v_Saal.ID
  LEFT JOIN Reservierung ON Vorstellung.ID = Reservierung.fk_Vorstellung_ID
  LEFT JOIN nm_Reservierung_Sitzplatz ON Reservierung.ID = nm_Reservierung_Sitzplatz.fk_Reservierung_ID
  LEFT JOIN Sitzplatz ON nm_Reservierung_Sitzplatz.fk_Sitzplatz_ID = Sitzplatz.ID
  GROUP BY Vorstellung.Beginn, v_Film.Spieldauer, v_Film.Name, v_Film.Beschreibung, v_Film.Bewertung, v_Film.SchauspielerListe, v_Saal.Name
  ORDER BY Vorstellung.Beginn ASC, v_Saal.Name ASC
;