USE project;

/*
---------------------------------- 1 ----------------------------------
Geben Sie mit SQL alle Menüs mit den darin enthaltenen Produkten menschenlesbar
als eine Art Speisekarte aus.
-----------------------------------------------------------------------
*/
SELECT Menuname, GROUP_CONCAT(Produktname SEPARATOR ', ') AS 'Produkte'
FROM Menu
         JOIN Menucontent M on Menu.MenuID = M.MenuID
         JOIN Menge M2 on M.MengenID = M2.MengenID
         JOIN Produkt P on M2.ProduktID = P.ProduktID
GROUP BY Menuname;


/*
---------------------------------- 2 ----------------------------------
Erweitern Sie die Ausgabe aus der vorherigen Abfrage um hilfreiche Informationen
bezüglich der Gesamtnährwerte dieser Menüs.
-----------------------------------------------------------------------
*/
SELECT Menuname,
       GROUP_CONCAT(Produktname SEPARATOR ', ')                                         AS 'Produkte',
       ROUND(SUM(Fett * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2)          AS 'Fett',
       ROUND(SUM(Kohlenhydrate * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2) AS 'Kohlenhydrate',
       ROUND(SUM(Eiweiss * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2)       AS 'Eiweiss',
       ROUND(SUM(Brennwert * (SELECT Menge FROM Menge WHERE MengenID = M.MengenID) / 100), 2)     AS 'Brennwert'
FROM Menu
         JOIN Menucontent M on Menu.MenuID = M.MenuID
         JOIN Menge M3 on M.MengenID = M3.MengenID
         JOIN Produkt P on M3.ProduktID = P.ProduktID
         JOIN Naehrwerte N on P.ProduktID = N.ProduktID
GROUP BY Menuname;


/*
---------------------------------- 3 ----------------------------------
Geben sie mit SQL alle Produkte mit für Kundinnen und Kunden relevanten Informationen für
eine bestimmte Person aus (betreffend Allergenen, Unverträglichkeiten, vegetarisch, etc.).
-----------------------------------------------------------------------
*/
SET @vorname := 'Florian';
SET @nachname := 'Kaiser';

# UNION von Nur Zusatzstoffe und Nur Allergene
SELECT Produktname, GROUP_CONCAT(Zusatzstoff) AS Zusatzstoff, GROUP_CONCAT(Allergen) AS Allergen
FROM (SELECT Produktname,
             GROUP_CONCAT(enthaeltZusatzstoff.E_Nummer) as Zusatzstoff,
             NULL                                          Allergen
      FROM Person
               # Zusatzstoffe
               JOIN Zusatzstoffunvertraeglichkeit on Person.PersonID = Zusatzstoffunvertraeglichkeit.PersonID
               JOIN enthaeltZusatzstoff on enthaeltZusatzstoff.E_Nummer = Zusatzstoffunvertraeglichkeit.E_Nummer
               LEFT JOIN Produkt on Produkt.ProduktID = enthaeltZusatzstoff.ProduktID
      WHERE Personenname = @nachname
        AND Personenvorname = @vorname
      GROUP BY Produktname
      UNION ALL
      SELECT P.Produktname,
             NULL                                                         Zusatzstoff,
             GROUP_CONCAT(DISTINCT Allergenbezeichnung SEPARATOR ', ') AS Allergen
      FROM Person
               # Allergien
               JOIN Allergie on Person.PersonID = Allergie.PersonID
               JOIN Allergen on Allergen.AllergenID = Allergie.AllergenID
               JOIN enthaeltAllergen on Allergen.AllergenID = enthaeltAllergen.AllergenID
               JOIN Produkt P on P.ProduktID = enthaeltAllergen.ProduktID
      WHERE Personenname = @nachname
        AND Personenvorname = @vorname
      GROUP BY Produktname) AS x
GROUP BY Produktname;


/*
---------------------------------- 4 ----------------------------------
Sortieren Sie alle enthaltenen Produkte absteigend nach Anzahl der enthaltenen Zusatzstoffe.
-----------------------------------------------------------------------
*/
SELECT Produktname,
       LENGTH(GROUP_CONCAT(E_Nummer)) - LENGTH(REPLACE(GROUP_CONCAT(E_Nummer), ',', '')) + 1 AS 'Anzahl Zusatzstoffe'
FROM Produkt
         JOIN enthaeltZusatzstoff eZ on Produkt.ProduktID = eZ.ProduktID
GROUP BY Produktname
ORDER BY LENGTH(GROUP_CONCAT(E_Nummer)) - LENGTH(REPLACE(GROUP_CONCAT(E_Nummer), ',', '')) + 1 DESC;


/*
---------------------------------- 5 ----------------------------------
Sortieren Sie alle [in der Datenbank (anm. d. St.)] enthaltenen Produkte aufsteigend nach Kalorienanzahl in der Portion, die verkauft wird.
Hinweis: Produkte ohne Brennwert werden nicht angezeigt
-----------------------------------------------------------------------
*/
SELECT Produktname,
       ROUND(Brennwert * (M.Menge / 100), 1) AS Brennwert,
       M.Menge,
       M.Einheit
FROM Produkt
    JOIN Naehrwerte N on Produkt.ProduktID = N.ProduktID
    JOIN Menge M on Produkt.ProduktID = M.ProduktID
ORDER BY Brennwert;

/*
---------------------------------- 6 ----------------------------------
Geben Sie eine SQL Anfrage an, die alle Produkte ausgibt, die eine bestimmte Anzahl von Emulgatoren enthalten.
    a. Keine Emulgatoren
    b. 1 Emulgator
    c. 2 Emulgatoren
    d. Mehr
-----------------------------------------------------------------------
*/

SELECT Produktname,
       IFNULL( # wenn feld NULL, Keine Emulgatoren
           REPLACE( # wenn feld zero, Keine Emulgatoren
               REPLACE( # wenn feld zwei, Zwei Emulgatoren
                    REPLACE( # wenn feld eins, Ein Emulgator
                        IF(     # wenn feld größer als zwei, Mehr Emulgatoren, ansonsten setze den gleichen wert wieder ins feld
                            LENGTH(GROUP_CONCAT(eZ.Anwendungsgrund)) - LENGTH(REPLACE(GROUP_CONCAT(eZ.Anwendungsgrund), 'E', ''))
                                > 2, 'Mehr Emulgatoren',
                            LENGTH(GROUP_CONCAT(eZ.Anwendungsgrund)) - LENGTH(REPLACE(GROUP_CONCAT(eZ.Anwendungsgrund), 'E', '')))
                    , 1, 'Ein Emulgator')
                , 2, 'Zwei Emulgatoren')
            , 0, 'Keine Emulgatoren')
        , 'Keine Emulgatoren')
       AS Emgulagtoren,
       GROUP_CONCAT(eZ.Anwendungsgrund) AS 'Anwendungsgrund'
FROM Produkt
         LEFT JOIN enthaeltZusatzstoff eZ on Produkt.ProduktID = eZ.ProduktID
GROUP BY Produktname
ORDER BY LENGTH(GROUP_CONCAT(eZ.Anwendungsgrund)) - LENGTH(REPLACE(GROUP_CONCAT(eZ.Anwendungsgrund), 'E', ''));