SELECT K_Bereich, SUM(B_Preis)
  FROM teilnehmer INNER JOIN buchung
    ON buchung.TN_Nr = teilnehmer.TN_Nr
                  INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
                  INNER JOIN kurs
    ON kurs.K_Nr = termin.K_Nr
  GROUP BY K_Bereich;

SELECT K_Bereich,
       TO_CHAR(T_Beginn, 'YYYY') AS Jahr,
       SUM(B_Preis)
  FROM teilnehmer INNER JOIN buchung
    ON buchung.TN_Nr = teilnehmer.TN_Nr
                  INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
                  INNER JOIN kurs
    ON kurs.K_Nr = termin.K_Nr
  GROUP BY ROLLUP (TO_CHAR(T_Beginn, 'YYYY'), K_Bereich);

SELECT T_Ort AS Ort,
       TO_CHAR(T_Beginn, 'YYYY') AS Zeit,
       K_Bereich AS Bereich,
       SUM(B_Preis)
  FROM termin NATURAL JOIN buchung
              NATURAL JOIN kurs
  GROUP BY ROLLUP (TO_CHAR(T_Beginn, 'YYYY'), T_Ort, K_Bereich)
  ORDER BY TO_CHAR(T_Beginn, 'YYYY') DESC;

SELECT T_Ort AS Ort,
       TO_CHAR(T_Beginn, 'YYYY') AS Zeit,
       K_Bereich AS Bereich,
       SUM(B_Preis)
  FROM termin NATURAL JOIN buchung
              NATURAL JOIN kurs
  GROUP BY CUBE (TO_CHAR(T_Beginn, 'YYYY'), T_Ort, K_Bereich)
  ORDER BY K_Bereich, T_Ort, SUM(B_Preis) DESC;

BREAK ON REPORT;
SELECT DISTINCT
       TO_CHAR(T_Beginn, 'MM')   AS Monat,
       TO_CHAR(T_Beginn, 'YYYY') AS Jahr,
       K_Bereich                 AS Bereich,
       (SELECT SUM(a.B_Preis)
          FROM buchung b
         WHERE b.B_NrAnmelder = a.B_NrAnmelder
           AND T_Nr = T_Nr)      AS Summe
  FROM buchung a NATURAL JOIN termin
                 NATURAL JOIN kurs
 WHERE TO_CHAR(T_Beginn, 'YYYY') = '2003'
   AND TO_CHAR(T_Beginn, 'MM') BETWEEN 5 AND 7;

SELECT U_Nr, K_Bereich, SUM(B_Preis)
  FROM teilnehmer INNER JOIN buchung
    ON buchung.TN_Nr = teilnehmer.TN_Nr
                  INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
                  INNER JOIN kurs
    ON kurs.K_Nr = termin.K_Nr
  GROUP BY GROUPING SETS ((U_Nr, K_Bereich), (U_Nr, K_Bereich));

SELECT T_Ort AS Ort,
       TO_CHAR(T_Beginn, 'YYYY') AS Jahr,
       TO_CHAR(T_Beginn, 'MM')   AS Monat,
       K_Bereich AS Bereich,
       SUM(B_Preis)
  FROM termin NATURAL JOIN buchung
              NATURAL JOIN kurs
  GROUP BY GROUPING SETS ((TO_CHAR(T_Beginn, 'YYYY'), T_Ort),
                          (TO_CHAR(T_Beginn, 'YYYY'), K_Bereich),
                          (TO_CHAR(T_Beginn, 'MM'), T_Ort),
                          (TO_CHAR(T_Beginn, 'MM'), K_Bereich),
                          (T_Ort, K_Bereich));

SELECT T_Ort AS Ort,
       K_Bereich AS Bereich,
       SUM(B_Preis)
  FROM termin NATURAL JOIN buchung
              NATURAL JOIN kurs
  GROUP BY GROUPING SETS ((T_Ort, K_Bereich));

SELECT SUBSTR(U_Name, 1, 30) AS Unternehmen,
       K_Bereich             AS Bereich
       SUM(B_Preis)
  FROM buchung NATURAL JOIN teilnehmer
               NATURAL JOIN unternehmen
               NATURAL JOIN termin
               NATURAL JOIN kurs
  GROUP BY GROUPING SETS ((U_Name, K_Bereich))
  HAVING SUM(B_Preis) > 10000
  ORDER BY SUM(B_Preis) DESC;

SELECT TO_CHAR(T_Beginn, 'MM') AS Monat,
       K_Bereich AS Bereich,
       COUNT(B_Nr) AS Zahl
  FROM buchung INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
               INNER JOIN kurs
    ON termin.K_Nr = kurs.K_Nr
 GROUP BY GROUPING SETS (TO_CHAR(T_Beginn, 'MM'), K_Bereich,
                        (TO_CHAR(T_Beginn, 'MM'), K_Bereich));  

SELECT SUBSTR(U_Name, 1, 30) AS Unternehmen,
       K_Bereich             AS Bereich,
       (SELECT COUNT(buchung.TN_Nr)
          FROM buchung INNER JOIN teilnehmer
            ON buchung.TN_Nr = teilnehmer.TN_Nr
                       INNER JOIN unternehmen b
            ON teilnehmer.U_Nr = b.U_Nr
         WHERE b.U_Nr = a.U_Nr
         GROUP BY U_Nr) AS TNZahl,
       (SELECT COUNT(T_Nr)
          FROM buchung INNER JOIN teilnehmer
            ON buchung.TN_Nr = teilnehmer.TN_Nr
                       INNER JOIN unternehmen b
            ON teilnehmer.U_Nr = b.U_Nr
         WHERE b.U_Nr = a.U_Nr
         GROUP BY U_Nr) AS Termine,         
       SUM(B_Preis)
  FROM buchung INNER JOIN teilnehmer
    ON buchung.TN_Nr = teilnehmer.TN_Nr
               INNER JOIN unternehmen a
    ON teilnehmer.U_Nr = a.U_Nr               
               INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
               INNER JOIN kurs
    ON termin.K_Nr = kurs.K_Nr
  GROUP BY GROUPING SETS ((U_Name, K_Bereich, U_Nr))
  HAVING SUM(B_Preis) > 10000  
  ORDER BY SUM(B_Preis) DESC;

SELECT SUBSTR(U_Name, 1, 30) AS Unternehmen,
       U_Nr,
       K_Bereich             AS Bereich,
       (SELECT COUNT(buchung.TN_Nr)
          FROM buchung INNER JOIN teilnehmer
            ON buchung.TN_Nr = teilnehmer.TN_Nr
                       INNER JOIN unternehmen b
            ON teilnehmer.U_Nr = b.U_Nr
         WHERE b.U_Nr = a.U_Nr
         GROUP BY U_Nr) AS TNZahl,
       (SELECT COUNT(DISTINCT T_Nr)
          FROM buchung INNER JOIN teilnehmer
            ON buchung.TN_Nr = teilnehmer.TN_Nr
                       INNER JOIN unternehmen b
            ON teilnehmer.U_Nr = b.U_Nr
         WHERE b.U_Nr = a.U_Nr
         GROUP BY U_Nr) AS Termine,         
       SUM(B_Preis)
  FROM buchung INNER JOIN teilnehmer
    ON buchung.TN_Nr = teilnehmer.TN_Nr
               INNER JOIN unternehmen a
    ON teilnehmer.U_Nr = a.U_Nr               
               INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
               INNER JOIN kurs
    ON termin.K_Nr = kurs.K_Nr
  GROUP BY GROUPING SETS ((U_Name, K_Bereich, U_Nr))
  HAVING SUM(B_Preis) > 15000
  ORDER BY SUM(B_Preis) DESC;


SELECT TO_CHAR(T_Beginn, 'MM')   AS Monat,
       TO_CHAR(T_Beginn, 'YYYY') AS Jahr,
       K_Bereich                 AS Bereich,
       SUM(B_Preis)              AS Summe
  FROM buchung NATURAL JOIN termin
               NATURAL JOIN kurs
 WHERE TO_CHAR(T_Beginn, 'YYYY') = '2003'
 GROUP BY ROLLUP (TO_CHAR(T_Beginn, 'YYYY'),TO_CHAR(T_Beginn, 'MM'), K_Bereich);

SELECT TO_CHAR(T_Beginn, 'MM')   AS Monat,
       TO_CHAR(T_Beginn, 'YYYY') AS Jahr,
       K_Bereich                 AS Bereich,
       SUM(B_Preis)              AS Umsatz
  FROM buchung NATURAL JOIN termin
               NATURAL JOIN kurs
 WHERE TO_CHAR(T_Beginn, 'YYYY') = '2003'
   AND TO_CHAR(T_Beginn, 'MM') BETWEEN 5 AND 7
 GROUP BY CUBE(TO_CHAR(T_Beginn, 'YYYY'), TO_CHAR(T_Beginn, 'MM'), K_Bereich);

SELECT U_Stadt, COUNT(U_Nr),
RANK() OVER       (ORDER BY COUNT(U_Nr) DESC) AS Hitparade1,
DENSE_RANK() OVER (ORDER BY COUNT(U_Nr) DESC) AS Hitparade2
FROM unternehmen
GROUP BY U_Stadt;

SELECT U_Stadt, COUNT(U_Nr),
RANK() OVER      (ORDER BY COUNT(U_Nr) DESC) AS Hitparade1,
CUME_DIST() OVER (ORDER BY COUNT(U_Nr) ASC) AS Hitparade2
FROM unternehmen
GROUP BY U_Stadt
ORDER BY COUNT(U_Nr) DESC;

SELECT U_Stadt, COUNT(U_Nr),
RANK() OVER         (ORDER BY COUNT(U_Nr) DESC) AS Hitparade1,
PERCENT_RANK() OVER (ORDER BY COUNT(U_Nr) ASC) AS Hitparade2
FROM unternehmen
GROUP BY U_Stadt
HAVING COUNT(U_Nr) > 1
ORDER BY COUNT(U_Nr) DESC;

SELECT K_Titel,
       K_Untertitel,
       K_Dauer,
       WIDTH_BUCKET(K_Dauer, 1, 4, 2) AS "Typ"
  FROM kurs
 ORDER BY "Typ"


SELECT U_Name, K_Bereich, B_TZahl, T_Zahl, U_Summe
FROM Unternehmensuebersicht
WHERE (U_Name LIKE 'Anlagen%' OR U_Name = 'Winke AG')
  AND U_Summe > 1500;

CREATE MATERIALIZED VIEW Unternehmensuebersicht2 (U_Name, K_Bereich, B_TZahl, T_Zahl, U_Summe)
AS
SELECT SUBSTR(U_Name, 1, 30) AS Unternehmen,
       U_Nr,
       K_Bereich             AS Bereich,
       (SELECT COUNT(buchung.TN_Nr)
          FROM buchung INNER JOIN teilnehmer
            ON buchung.TN_Nr = teilnehmer.TN_Nr
                       INNER JOIN unternehmen b
            ON teilnehmer.U_Nr = b.U_Nr
         WHERE b.U_Nr = a.U_Nr
         GROUP BY U_Nr) AS TNZahl,
       (SELECT COUNT(DISTINCT T_Nr)
          FROM buchung INNER JOIN teilnehmer
            ON buchung.TN_Nr = teilnehmer.TN_Nr
                       INNER JOIN unternehmen b
            ON teilnehmer.U_Nr = b.U_Nr
         WHERE b.U_Nr = a.U_Nr
         GROUP BY U_Nr) AS Termine,         
       SUM(B_Preis)
  FROM buchung INNER JOIN teilnehmer
    ON buchung.TN_Nr = teilnehmer.TN_Nr
               INNER JOIN unternehmen a
    ON teilnehmer.U_Nr = a.U_Nr               
               INNER JOIN termin
    ON buchung.T_Nr = termin.T_Nr
               INNER JOIN kurs
    ON termin.K_Nr = kurs.K_Nr
  GROUP BY GROUPING SETS ((U_Name, K_Bereich, U_Nr))
  ORDER BY SUM(B_Preis) DESC;
