Gruppierungen / Aggregationen

Gruppierungen / Aggregationen

Aggregationsfunktionen

SELECT
  sum(gehalt),
  round(avg(gehalt)),
  min(gehalt),
  max(gehalt),
  count(*),
  count(bonus)
FROM mitarbeiter;

Gruppierung

SELECT oeid,
  sum(gehalt),
  round(avg(gehalt)),
  min(gehalt),
  max(gehalt),
  count(*),
  count(bonus)
FROM mitarbeiter
GROUP BY oeid
ORDER BY oeid;

Konzept Gruppierung

  • Gruppierungskriterium (hier Wert gleicher Wert in oeid)
  • Partitionierung der Detaildaten in Gruppen
  • Anwendung von Aggregationsfunktionen pro Gruppe
  • Ein Datensatz pro Gruppe in der Ausgabe

Aggregationsebenen

SELECT oeid, sum(gehalt)
FROM mitarbeiter
GROUP BY oeid
ORDER BY oeid;
  • Alle Ausgabespalten auf einer Aggregationsstufe
    • oeid: kommt aus dem GROUP BY
    • gehalt: Aggregationsfunktion angewendet auf Spalte
SELECT oeid, name, sum(gehalt)
FROM mitarbeiter
GROUP BY oeid
ORDER BY oeid;
            
  • Ausgabespalten auf verschiedenen Aggregationsstufen
    • oeid: aggregiert
    • name: auf Deteilebene (nicht erlaubt)
    • gehalt: aggregiert

Gruppierung und Verbund

SELECT oe.bezeichnung,
  sum(gehalt),
  count(*)
FROM mitarbeiter m
     join orgeinheit oe ON oe.oeid=m.oeid
GROUP BY oe.bezeichnung
ORDER BY oe.bezeichnung;

Gruppierung nach Ausdrücken 1

SELECT
  extract(year FROM eintrittsdatum) AS eintrittsjahr,
  sum(gehalt),
  count(*)
FROM mitarbeiter
GROUP BY extract(year from eintrittsdatum)
ORDER BY extract(year from eintrittsdatum);

Gruppierung nach Ausdrücken 2

SELECT
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END AS eintritt,
  sum(gehalt), count(*)
FROM mitarbeiter
GROUP BY
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END;

Gruppierung nach mehreren Spalten

SELECT oeid,
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END AS eintritt,
  sum(gehalt), count(*)
FROM mitarbeiter
GROUP BY
  oeid,
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END
ORDER BY oeid;

Änderung der Anzahl der Gruppen

 SELECT
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END AS eintritt,
  sum(gehalt), count(*)
  FROM mitarbeiter
GROUP BY
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END;

Bei Gruppierung nach mehreren Spalten erhöht sich die Anzahl der Gruppen entsprechend der Kombinationen
SELECT
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END AS eintritt,
  oeid,
  sum(gehalt), count(*)
FROM mitarbeiter
GROUP BY
  CASE
    WHEN eintrittsdatum >= '01.01.2010' THEN '2010 (ab)'
    WHEN eintrittsdatum >= '01.01.2000' THEN '2009 (bis)'
  END,
  oeid
ORDER BY oeid;

Gruppierung bei abhängigen Spalten

Geht so nicht, Bezeichnung ist auf Detailebene
SELECT oe.oeid, oe.bezeichnung, sum(gehalt)
FROM mitarbeiter m
     join orgeinheit oe ON oe.oeid=m.oeid
GROUP BY oe.oeid
ORDER BY oe.oeid;

SELECT oe.oeid, oe.bezeichnung, sum(gehalt)
FROM mitarbeiter m
     join orgeinheit oe ON oe.oeid=m.oeid
GROUP BY oe.oeid, oe.bezeichnung
ORDER BY oe.oeid;
Jetzt geht es (Bezeichnung in GROUP BY übernehmen), es entstehen auch keine neuen Kombinationen, da oe.bezeichnung von oe.oeid abhängt

Bedingungen auf Gruppenebene

SELECT oeid, sum(gehalt), count(*)
FROM mitarbeiter
GROUP BY oeid
ORDER BY oeid;
SELECT oeid, sum(gehalt), count(*)
FROM mitarbeiter
GROUP BY oeid
HAVING count(*) > 1
ORDER BY oeid;

Bedingungen auf Detail- und Gruppenebene

SELECT oeid, sum(gehalt), count(*)
FROM mitarbeiter
GROUP BY oeid
HAVING count(*) > 1
ORDER BY oeid;
SELECT oeid, sum(gehalt), count(*)
FROM mitarbeiter
WHERE bonus is null
GROUP BY oeid
HAVING count(*) > 1
ORDER BY oeid;

Aufbau Query mit Gruppierung

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Top Sitemap 13 12 11 10 9 8 7 6 5 4 3 2 1 0