Aggregation und Gruppierung in SQL

Lerne, zusammenfassende Fragen zu einer Datenbanktabelle zu beantworten: wie viele, wie viel, im Durchschnitt, das Kleinste und das Größte. Verwende COUNT, SUM, AVG, MIN und MAX, gruppiere Zeilen mit GROUP BY für ein Ergebnis pro Kategorie und behalte mit HAVING nur die benötigten Gruppen. Dabei lernst du, wie fehlende Werte und ganzzahlige Division Ergebnisse verändern, wie du Durchschnitte und Prozentwerte rundest und prüfst, ob eine zusammenfassende Abfrage die richtigen Zahlen liefert. Die Beispiele verwenden Standard-SQL, das auf SQLite und PostgreSQL läuft. Unterschiede bei MySQL, SQL Server und Oracle werden genannt, wo sie eine Rolle spielen.

AnfängerEinheit 4 von 6 in Kurs: SQL – Datenbanken abfragen mit SELECT, JOIN und GROUP BY

Was du lernst

  1. Fasse viele Zeilen mit COUNT, SUM, AVG, MIN und MAX zu Werten zusammen, wähle die passende Zählweise und sage vorher, wie fehlende Werte ein Ergebnis verändern.
    • Summen, Durchschnitte, kleinste und größte Werte ermitteln
      Verwende SUM, AVG, MIN und MAX auf einer ganzen Tabelle oder auf den von einer WHERE-Klausel beibehaltenen Zeilen und kombiniere mehrere davon in einer Abfrage.
    • Zeilen, Werte und unterschiedliche Werte zählen
      Wähle zwischen COUNT(*), COUNT(Spalte) und COUNT(DISTINCT Spalte) und lerne, wie jede Variante wiederholte und fehlende Werte behandelt.
    • Vorhersagen, wie sich NULL-Werte auf Aggregate auswirken
      Lerne, dass Aggregate NULL-Werte überspringen, sage Ergebnisse für leere Eingabemengen vorher und ersetze NULL durch einen Ersatzwert, wenn die Frage es verlangt.
  2. Verwende GROUP BY für eine zusammenfassende Zeile pro Kategorie, pro Wertekombination oder pro berechnetem Wert und beachte die Regel, was eine gruppierte Abfrage anzeigen darf.
    • Jede Kategorie mit GROUP BY zusammenfassen
      Teile eine Tabelle in Gruppen mit einem gemeinsamen Wert auf, berechne Aggregate pro Gruppe und sortiere und begrenze das gruppierte Ergebnis.
    • Die Regel beachten, was eine gruppierte Abfrage anzeigen darf
      Lerne, welche Spalten in der SELECT-Liste einer gruppierten Abfrage stehen dürfen, behebe den Fehler bei einem Regelverstoß und erkenne Unterschiede zwischen Datenbanken.
    • Nach mehreren Spalten und nach berechneten Werten gruppieren
      Gruppiere Zeilen nach Spaltenkombinationen und nach Ausdrücken wie dem Monat eines Datums oder einer CASE-Kategorie und lies das detailliertere Ergebnis.
  3. Behalte nur die Gruppen, deren Summen, Anzahlen oder Durchschnitte eine Bedingung erfüllen, und entscheide, ob eine Bedingung in WHERE oder HAVING gehört.
    • Nur die Gruppen behalten, die eine Bedingung erfüllen
      Schreibe HAVING-Bedingungen für Aggregatwerte, einschließlich nicht angezeigter Aggregate, um ein gruppiertes Ergebnis zu filtern.
    • Zwischen WHERE und HAVING wählen
      Entscheide anhand der logischen Reihenfolge einer Abfrage, ob eine Bedingung Zeilen oder Gruppen filtert, und sage vorher, wie diese Wahl das Ergebnis verändert.
  4. Vermeide ganzzahlige Division, lerne den Zahlentyp kennen, den jedes Aggregat zurückgibt, und runde Durchschnitte, Summen und Prozentwerte zum richtigen Zeitpunkt.
    • Ganzzahlige Division bei Durchschnitten und Prozentwerten vermeiden
      Erkenne, wann bei der Division von Aggregaten Nachkommastellen verloren gehen, behebe dies mit einem Dezimaloperanden und lerne, wie sich Ergebnistypen zwischen Datenbanken unterscheiden.
    • Aggregierte Ergebnisse runden
      Runde Durchschnitte, Summen und Prozentwerte mit ROUND zum richtigen Zeitpunkt und gehe mit den Unterschieden zwischen SQLite und PostgreSQL um.
  5. Kombiniere CASE mit Aggregaten für bedingte Zählungen, Summen und Prozentwerte und übersetze eine Frage in eine gruppierte Abfrage, deren Zahlen du prüfen kannst.
    • Mit CASE bedingt zählen und summieren
      Setze einen CASE-Ausdruck in ein Aggregat, um mehrere bedingte Zählungen, Summen und Prozentwerte in einer gruppierten Abfrage zu berechnen.
    • Aus einer Frage eine zusammenfassende Abfrage erstellen und prüfen
      Übersetze eine geschäftliche Frage Schritt für Schritt in eine gruppierte Abfrage, vermeide es, Detailebenen zu vermischen, und prüfe, ob die Zahlen stimmen.

SQL-Aggregation einfach erklärt

5 Kapitel

1

Daten mit Aggregatfunktionen zusammenfassen

Eine Tabelle erfasst einzelne Ereignisse; ein Bericht benötigt oft einige Zahlen, die sie zusammen beschreiben. Aggregatfunktionen machen aus Zeilen Anzahlen, Summen, Durchschnitte und Extremwerte. Die Wahl der Funktion ist nur ein Teil der Aufgabe: Du musst auch entscheiden, welche Zeilen in die Berechnung gehören und was fehlende Werte bedeuten. An einer kleinen Bestelltabelle prüfen wir jede Antwort von Hand, bevor wir uns auf die Abfrage verlassen.

1.1 Summen, Durchschnitte, kleinste und größte Werte ermitteln

Eine Aggregatfunktion fasst Werte aus vielen Zeilen zu einem Ergebnis zusammen. Oracle nennt sie auch Gruppenfunktion. Ohne GROUP BY behandelt eine Aggregatabfrage alle Zeilen, die WHERE passieren, als eine Gruppe und gibt eine zusammenfassende Zeile zurück.

Beginne mit Daten, die du prüfen kannst

Jede Zeile in orders ist eine Bestellung. Die numerischen Spalten unten enthalten ganze Zahlen; order_id ist der Primärschlüssel. Datumswerte werden in SQLite als ISO-Text und in PostgreSQL mit dem Typ DATE gespeichert.

order_idcustomerregionamountquantitydiscountorder_date
1AnaEast1202102026-01-05
2BenWest801NULL2026-01-17
3AnaEast45352026-02-02
4ChenNorth2004NULL2026-02-14
5BenWest60102026-02-20
6DaraEast952NULL2026-03-03
7ChenNorth1505152026-03-09
8EliNULL301NULL2026-03-21
Wähle die Kennzahl

SUM(amount) addiert die Beträge. AVG(amount) ergibt ihr arithmetisches Mittel. MIN(amount) ermittelt den kleinsten und MAX(amount) den größten Betrag. Du kannst alle vier in einer Abfrage anfordern:

SELECT SUM(amount) AS total, AVG(amount) AS avg_amount, MIN(amount) AS smallest, MAX(amount) AS largest FROM orders;

Das Ergebnis ist eine Zeile: Summe 780, Durchschnitt 97,5, kleinster Wert 30 und größter Wert 200. Addiere die acht Beträge, um 780 zu erhalten, und teile dann durch acht für 97,5. Jede Funktion verarbeitet dieselben acht Eingabezeilen. Aussagekräftige Aliase nach AS machen die Ausgabeüberschriften nützlich; eine erzeugte Überschrift wie sum sagt wenig darüber aus, was addiert wurde.

Filtere vor der Berechnung

Um Bestellungen aus East zusammenzufassen, schreibe SELECT COUNT(*) AS orders, SUM(amount) AS total FROM orders WHERE region = 'East';. Der Filter behält die Beträge 120, 45 und 95. Die Abfrage gibt drei Bestellungen und eine Summe von 260 zurück. WHERE wählt die Eingabezeilen aus, bevor ein Aggregat berechnet wird.

Ein Aggregat kann auch einen berechneten Ausdruck als Argument nehmen. In einer Tabelle mit quantity und unit_price ermittelt SUM(quantity * unit_price) zunächst den Umsatz jeder Zeile und addiert ihn dann. Zwei Zeilen, zwei Artikel zu 5 und drei Artikel zu 10, tragen 10 und 30 bei, zusammen 40. SUM(quantity) * SUM(unit_price) multipliziert dagegen 5 mit 15 und ergibt 75. Steht die Berechnung innerhalb von SUM, bleibt jede Menge dem passenden Preis zugeordnet.

Lies Extremwerte richtig

MIN(order_date) ist 2026-01-05 und MAX(order_date) ist 2026-03-21. Datumswerte und ISO-Datumstext werden chronologisch sortiert. Text wie '03/21/2026' folgt der Zeichenreihenfolge, die nicht zuverlässig der Datumsreihenfolge entspricht. Auch Extremwerte bei Text folgen der Sortierfolge der Datenbank, also ihren Regeln zum Vergleichen von Text. Hier sind die Extremwerte der Kundennamen 'Ana' und 'Eli'; unterschiedliche Groß- und Kleinschreibung kann die Textsortierung verändern.

MAX(amount) gibt einen Betrag zurück, nicht die ganze Bestellung, die ihn enthält. Um einen Kunden mit einer größten Bestellung anzuzeigen, verwende SELECT customer, amount FROM orders ORDER BY amount DESC LIMIT 1;. PostgreSQL lehnt eine gewöhnliche Spalte customer neben MAX(amount) ohne passende Gruppierung ab. SQLite hat eine Sonderregel für ein einzelnes MIN oder MAX, die eine benachbarte Spalte aus der Zeile mit dem Extremwert zurückgeben kann; bei gleichen Extremwerten wird aber weiterhin eine Regel für den Gleichstand benötigt.

Wichtige Erkenntnisse

  • Ein Aggregat gibt für eine Gruppe von Zeilen einen Wert zurück.
  • WHERE wählt die Zeilen aus, die das Aggregat verarbeitet.
  • Berechne den Beitrag jeder Zeile innerhalb von SUM, wenn Werte einander zugeordnet bleiben müssen.
  • MIN und MAX folgen der Sortierung von Zahlen, Datumswerten oder Text.
  • Ein Extremwert identifiziert keine ganze Zeile.

1.2 Zeilen, Werte und unterschiedliche Werte zählen

„Wie viele?“ kann sich auf Zeilen, erfasste Werte oder unterschiedliche Werte beziehen. Das sind verschiedene Zählweisen, auch wenn sie in einer kleinen Tabelle zufällig dieselbe Zahl ergeben.

Drei Formen von COUNT
AusdruckWas er zählt
COUNT(*)Jede Eingabezeile
COUNT(region)Zeilen mit einer Region, die nicht NULL ist
COUNT(DISTINCT region)Unterschiedliche Regionswerte ohne NULL

In der Bestelltabelle lauten die Regionen East, West, East, North, West, East, North und NULL. SELECT COUNT(*) AS order_rows, COUNT(region) AS with_region, COUNT(DISTINCT region) AS regions FROM orders; gibt 8, 7 und 3 zurück. Die wiederholten Regionsnamen werden bei COUNT(region) einzeln gezählt, aber jeder Name trägt nur einmal zur Anzahl unterschiedlicher Werte bei.

Für „Wie viele verschiedene Kunden haben bestellt?“ verwende COUNT(DISTINCT customer). Ana, Ben und Chen kommen jeweils zweimal vor, Dara und Eli jeweils einmal, die Antwort lautet also fünf Kunden. COUNT(customer) gibt acht zurück, weil jede Bestellung einen Kunden nennt. Es zählt Bestellzeilen mit Kundennamen, nicht Personen.

Eine erfasste Null zählt mit

Die Rabatte sind 10, NULL, 5, NULL, 0, NULL, 15 und NULL. COUNT(discount) gibt vier zurück. Die Null erfasst einen bekannten Wert und zählt genauso wie 10, 5 und 15. Eine leere Zeichenkette ist in SQLite und PostgreSQL ebenfalls ein Wert; Oracle behandelt eine leere Zeichenkette als NULL.

Ziehe die Anzahl der Werte ohne NULL von der Zeilenanzahl ab, um fehlende Einträge zu zählen: SELECT COUNT(*) - COUNT(region) AS missing_region FROM orders; gibt eins zurück. Das funktioniert, weil beide Zählungen genau dieselben Eingabezeilen verwenden.

DISTINCT-Listen und Anzahlen unterschiedlicher Werte

SELECT DISTINCT region FROM orders; listet East, West, North und eine NULL-Zeile auf. Die Abfrage soll unterschiedliche Werte zurückgeben, und NULL bleibt in dieser Liste. COUNT(DISTINCT region) gibt drei zurück, weil die Zählung NULL ignoriert. Schließe nicht durch Zählen einer Liste auf die Anzahl unterschiedlicher Werte, ohne zu entscheiden, ob ihre NULL-Zeile dazugehört.

DISTINCT kann auch innerhalb von SUM oder AVG stehen. Die Mengen sind 2, 1, 3, 4, 1, 2, 5 und 1. Ihre gewöhnliche Summe ist 19. SUM(DISTINCT quantity) behält nur 1, 2, 3, 4 und 5 und ergibt 15. Wiederholte Mengen stehen gewöhnlich für tatsächliche zusätzliche Verkäufe. Entfernst du sie, ändert sich die Kennzahl; doppelte Datensätze werden dadurch nicht korrigiert.

Kombinationen in zwei Schritten zählen

Erstelle für unterschiedliche Paare aus Region und Kunde zunächst eine Liste unterschiedlicher Werte:

SELECT COUNT(*) FROM (SELECT DISTINCT region, customer FROM orders) AS pairs;

Die innere Abfrage gibt fünf Paare zurück: East/Ana, East/Dara, North/Chen, West/Ben und NULL/Eli. Das äußere COUNT(*) zählt diese fünf Zeilen einschließlich NULL/Eli. Diese Form funktioniert in SQLite und PostgreSQL. MySQL akzeptiert auch COUNT(DISTINCT region, customer), aber diese Form schließt Kombinationen mit NULL aus und kann daher eine andere Frage beantworten. In SQLite und PostgreSQL ist die durch Kommas getrennte Form unzulässig.

Eine Zählung gibt niemals NULL zurück. SELECT COUNT(*) FROM orders WHERE region = 'South'; gibt eine zusammenfassende Zeile mit null zurück, weil es keine passenden Bestellungen gibt.

Wichtige Erkenntnisse

  • Wähle zwischen Zeilen, erfassten Werten und unterschiedlichen erfassten Werten.
  • Null ist ein erfasster Wert, daher zählt COUNT(column) sie mit.
  • Eine Liste unterschiedlicher Werte kann NULL enthalten; COUNT(DISTINCT column) überspringt NULL.
  • SUM(DISTINCT x) entfernt wiederholte Werte, auch berechtigte Wiederholungen.
  • Zähle unterschiedliche Kombinationen, indem du ein inneres Ergebnis mit unterschiedlichen Werten zählst.
  • COUNT gibt bei einer leeren Eingabemenge null zurück.

1.3 Vorhersagen, wie sich NULL-Werte auf Aggregate auswirken

NULL bedeutet, dass ein Wert fehlt oder unbekannt ist. Es verändert, welche Werte in ein Aggregat eingehen. Daher kann eine Summe oder ein Durchschnitt gültiges SQL sein und dennoch etwas anderes messen als beabsichtigt.

Bestimme den Nenner

Angenommen, scores enthält Ana 80, Ben NULL, Chen 70 und Dara 90. SUM(score) ist 240, COUNT(score) ist drei und COUNT(*) ist vier. AVG(score) ist 80: Die drei erfassten Punktzahlen ergeben zusammen 240 und werden durch drei geteilt.

Die fünf Standardaggregate ignorieren NULL-Argumente. COUNT(*) zählt jede Zeile, weil es kein Spaltenargument auswertet. MIN(score) ist 70 und MAX(score) ist 90; NULL wird weder zur kleinsten noch zur größten Punktzahl. Das unterscheidet sich vom Sortieren, bei dem NULL-Werte an einem Ende des Ergebnisses stehen: bei aufsteigender Sortierung in SQLite zuerst, in PostgreSQL zuletzt.

Für einen von Hand berechneten Durchschnitt wird die Anzahl der Werte ohne NULL benötigt: 1.0 * SUM(score) / NULLIF(COUNT(score), 0). Der Dezimaloperand erhält Nachkommastellen im Ergebnis, und NULLIF macht einen Divisor von null zu NULL. Eine Division durch COUNT(*) würde 60 ergeben und die fehlende Punktzahl damit wie null behandeln.

Entscheide, was ein Ersatzwert bedeutet

COALESCE gibt das erste Argument zurück, das nicht NULL ist. Wenn Ben noch nicht bewertet wurde, lass die Punktzahl fehlen und berechne den Durchschnitt der bekannten Ergebnisse. Wenn eine versäumte Prüfung als NULL erfasst ist, aber als null zählen muss, bildet AVG(COALESCE(score, 0)) den Durchschnitt von 80, 0, 70 und 90 und ergibt 60. Die Bedeutung der Daten entscheidet, ob diese Ersetzung gerechtfertigt ist.

Vergleiche COALESCE innerhalb und außerhalb einer Funktion. AVG(COALESCE(score, 0)) verändert die Werte, die in den Durchschnitt eingehen. COALESCE(AVG(score), 0) verändert nur ein NULL-Endergebnis; für diese Punktzahlen ergibt es weiterhin 80. Oracles NVL(x, 0) ist eine weitere Form mit zwei Argumenten, um NULL zu ersetzen.

Unterscheide keine Zeilen von keinen erfassten Werten

Bei WHERE region = 'South' bleiben keine Bestellungen übrig. Eine Aggregatabfrage ohne GROUP BY gibt dennoch eine Zeile zurück: COUNT(*) ist null, während SUM(amount), AVG(amount), MIN(amount) und MAX(amount) NULL sind. Um eine leere Summe als null anzuzeigen, verwende COALESCE(SUM(amount), 0). SQLite bietet auch TOTAL(amount) an, das bei leerer Eingabemenge 0,0 zurückgibt.

Betrachte nun die vier Bestellungen, deren Rabatt NULL ist. Es gibt Zeilen, aber keine erfassten Rabattwerte: COUNT(*) ist vier, COUNT(discount) ist null und SUM(discount) ist NULL. Null erfasste Werte und vier fehlende Werte sind unterschiedliche Beobachtungen.

Prüfe Ausdrücke, bevor sie in SUM eingehen

Rechnen mit NULL ergibt NULL. In SUM(amount - discount) tragen die vier Bestellungen ohne erfassten Rabatt überhaupt keinen Wert bei. Nur die Zeilen mit bekanntem Rabatt tragen bei: 110, 40, 60 und 135, zusammen 345.

Wenn ein fehlender Rabatt bedeutet, dass kein Rabatt gewährt wurde, schreibe SUM(amount - COALESCE(discount, 0)). Dann trägt jede Bestellung bei; der Gesamtbetrag 780 abzüglich der erfassten Rabatte 30 ergibt 750. Ein COALESCE um die gesamte Summe würde die ausgelassenen Bestellungen nicht zurückbringen, weil 345 bereits nicht NULL ist.

Um fehlende Werte zu finden, verwende IS NULL oder IS NOT NULL. WHERE discount IS NULL findet vier Bestellungen. discount = NULL ist niemals wahr und kann sie daher nicht auswählen.

Wichtige Erkenntnisse

  • AVG(x) teilt durch die Anzahl der Werte ohne NULL.
  • Ein inneres COALESCE verändert die Eingabewerte; ein äußeres verändert ein NULL-Ergebnis.
  • Eine leere Eingabemenge ergibt null für COUNT und NULL für die anderen vier Aggregate.
  • NULL innerhalb eines arithmetischen Ausdrucks kann den Beitrag einer Zeile entfallen lassen.
2

Zeilen gruppieren und jede Gruppe zusammenfassen

Eine Summe über die ganze Tabelle beantwortet eine Frage, aber viele Berichte benötigen ein Ergebnis pro Kunde, Region oder Monat. Die Gruppierung legt diese Detailebene fest, bevor die Aggregate berechnet werden. Du verfolgst, wie Zeilen zu Gruppen werden, wählst Spalten aus, die eine ganze Gruppe beschreiben können, und siehst, wie eine zusätzliche Gruppierungsspalte den Bericht verändert. Die Sortierung bestimmt anschließend die Darstellung der Ergebnisse; die Gruppierung allein legt keine Reihenfolge fest.

2.1 Jede Kategorie mit GROUP BY zusammenfassen

GROUP BY fasst Zeilen mit demselben Gruppierungswert zusammen. Jedes Aggregat wird innerhalb jeder Gruppe getrennt berechnet, und die Ausgabe enthält eine Zeile für jede nach dem Filtern vorhandene Gruppe.

Entscheide, was eine Ergebniszeile bedeutet

„Gesamtumsatz pro Region“ verlangt eine Ausgabezeile pro Region. Schreibe zunächst diesen Satz auf und verwende dann region als Gruppierungsspalte:

SELECT region, COUNT(*) AS orders, SUM(amount) AS total FROM orders GROUP BY region;

Die drei Beträge aus East, 120, 45 und 95, bilden eine Gruppe. Ihre Anzahl ist drei und ihre Summe 260. North hat zwei Bestellungen mit zusammen 350; West hat zwei mit zusammen 140. Elis Bestellung bildet eine Gruppe mit NULL als Region, einer Bestellung und einer Summe von 30. Es gibt vier Ergebniszeilen, nicht acht.

Lies die Abfrage als Abfolge: FROM liefert Bestellungen, ein vorhandenes WHERE entfernt Zeilen, GROUP BY fasst die verbleibenden Zeilen nach Region zusammen und die Aggregate fassen jede Gruppe zusammen. SELECT zeigt ihre Beschriftung und Kennzahlen an. Die Gruppierung verwirft die kleineren Bestellungen innerhalb einer Gruppe nicht; sie tragen alle bei, sofern sie nicht durch einen Zeilenfilter entfernt wurden.

Halte fehlende Kategorien sichtbar

Zeilen mit NULL in der Gruppierungsspalte gehören zu einer NULL-Gruppe. Das ist nützlich: Ein Bericht kann zeigen, wie viel Aktivität keiner erfassten Region zugeordnet ist. Er behandelt nicht jede fehlende Region als eigene Kategorie.

Um eine lesbare Beschriftung anzuzeigen, wähle COALESCE(region, 'No region') AS region_label und behalte GROUP BY region bei. Die Beschriftung verändert den angezeigten Wert. Um diese Zeilen aus den Berechnungen auszuschließen, ergänze WHERE region IS NOT NULL vor GROUP BY. Die resultierenden Summen ergeben zusammen 750, weil Elis Betrag von 30 ausgelassen wurde.

Eine gruppierte Abfrage über eine Eingabemenge ohne Zeilen gibt keine Gruppen zurück. Filtert man die Tabelle beispielsweise auf South und gruppiert dann nach Region, erhält man keine Ergebniszeilen. Das unterscheidet sich von einem Aggregat über die ganze Tabelle ohne GROUP BY, das selbst bei leerer Eingabemenge eine zusammenfassende Zeile erzeugt.

Sortiere die Gruppen ausdrücklich

GROUP BY garantiert keine Ausgabereihenfolge. Um die größten Regionen zuerst aufzulisten, ergänze ORDER BY total DESC. Der Alias total ist in ORDER BY erlaubt; ORDER BY SUM(amount) DESC ergibt dieselbe Sortierung.

Ein Kundenbericht kann die drei größten Summen auswählen:

SELECT customer, SUM(amount) AS total FROM orders GROUP BY customer ORDER BY total DESC, customer LIMIT 3;

Er gibt Chen 350, Ana 165 und Ben 140 zurück. Das zweite Sortierkriterium, customer, sorgt bei gleichen Summen für eine wiederholbare Reihenfolge. LIMIT 3 gibt nur drei Zeilen zurück; es behält nicht alle gleichen Werte am Grenzwert. SQL Server drückt diese Begrenzung mit SELECT TOP 3 aus, während Oracle FETCH FIRST 3 ROWS ONLY unterstützt.

Beim aufsteigenden Sortieren von Kategorienamen setzt SQLite NULL normalerweise an den Anfang und PostgreSQL an das Ende. Gib die gewünschte Sortierung an, wenn die Position wichtig ist.

Prüfe die Gruppierungsspalte

SELECT DISTINCT region FROM orders und SELECT region FROM orders GROUP BY region geben dieselben unterschiedlichen Regionsbezeichnungen einschließlich NULL zurück. Verwende eine Gruppierung, wenn du auch eine Kennzahl für jede Bezeichnung benötigst.

Die Gruppierung nach der eindeutigen order_id ergibt acht Gruppen mit je einer Zeile. Jede Anzahl ist eins, und jede Betragssumme entspricht dem Betrag der jeweiligen Zeile. Für einen regionalen Bericht zeigt dieses Ergebnis, dass die Gruppierungsspalte zu detailliert ist.

Wichtige Erkenntnisse

  • Formuliere, wofür eine Ausgabezeile steht, bevor du GROUP BY festlegst.
  • Alle NULL-Gruppierungswerte bilden eine Gruppe.
  • Verwende ORDER BY für die Ergebnisreihenfolge und ein zweites Kriterium für gleiche Werte.
  • Die Gruppierung nach einem eindeutigen Zeilenschlüssel ergibt Gruppen mit je einer Zeile.

2.2 Die Regel beachten, was eine gruppierte Abfrage anzeigen darf

Ein gruppierter Bericht muss viele Eingabezeilen in einer Ergebniszeile zusammenfassen. Jeder angezeigte Wert benötigt daher eine klare Bedeutung für die ganze Gruppe. Deshalb schränkt SQL ein, welche Spalten du auswählen kannst.

Beachte die übertragbare Gruppierungsregel

Ein Eintrag in einem gruppierten SELECT sollte eine Gruppierungsspalte, ein aus Gruppierungsspalten gebildeter Ausdruck, ein Aggregat oder eine Konstante sein. Betrachte:

SELECT region, customer, COUNT(*) FROM orders GROUP BY region;

East enthält Ana, Ana und Dara. Die Gruppe hat eine Region und eine Anzahl, aber zwei verschiedene Kundennamen. Die Abfrage legt nicht fest, welchen Kunden eine einzelne Ergebniszeile für East anzeigen soll. PostgreSQL lehnt die nicht gruppierte Spalte customer ab.

Dasselbe Problem tritt ohne GROUP BY auf: SELECT customer, SUM(amount) FROM orders kombiniert eine Summe über die ganze Tabelle mit einem einzelnen Namen. Für die Summe gibt es keinen einzelnen Kundennamen als Beschriftung.

Korrigiere die Abfrage passend zur Frage

Es gibt drei nützliche Korrekturen, jede mit einer anderen Bedeutung:

  • Für eine Zeile pro Region entferne customer: SELECT region, COUNT(*) FROM orders GROUP BY region;.
  • Für eine Zeile pro Region und Kunde gruppiere nach beiden: SELECT region, customer, COUNT(*) FROM orders GROUP BY region, customer;.
  • Für die Anzahl der Kunden pro Region aggregiere die Namen: SELECT region, COUNT(DISTINCT customer) AS customers FROM orders GROUP BY region;.

Die letzte Abfrage meldet zwei Kunden in East und einen in jeder anderen Regionsgruppe. Eine zusätzliche Spalte in GROUP BY kann die Detailebene des Berichts verändern. Wähle die Korrektur daher anhand der Frage und nicht nur anhand der Fehlermeldung.

Eine Gruppierungsspalte darf in SELECT fehlen. SELECT COUNT(*) FROM orders GROUP BY region; ist zulässig und gibt vier Anzahlen zurück: drei, zwei, zwei und eins, ohne garantierte Reihenfolge. Ohne ihre Regionsbezeichnungen sind diese Zahlen schwer zu verwenden.

Wende die Regel über SELECT hinaus an

Ein ORDER BY customer in einer gruppierten Abfrage hat bei einer Gruppierung allein nach Region dasselbe Problem: Welcher Kunde soll die Position von East bestimmen? Auch HAVING-Bedingungen in gruppierten Abfragen müssen eine ganze Gruppe beschreiben. Verwende dort gruppierte Spalten oder Aggregatausdrücke.

Erkenne nachgiebiges Datenbankverhalten

SQLite akzeptiert eine nicht aggregierte Spalte, also eine ausgewählte Spalte, die weder gruppiert noch aggregiert wird. Es nimmt einen Wert aus einer Eingabezeile der Gruppe. Ein scheinbar erfolgreiches Ergebnis wie 'Ana' neben East bedeutet nicht, dass Ana für jede Bestellung in dieser Region steht.

Bei genau einem eingebauten Aggregat MIN oder MAX nimmt SQLite Werte nicht aggregierter Spalten aus einer Zeile mit dem Extremwert. Bei gleichen Extremwerten und mehreren Aggregaten für Extremwerte ist ungewiss, welche Zeile ausgewählt wird. Diese Abkürzung ist datenbankspezifisch. Wenn du eine Bestellung mit einem Extrembetrag suchst, ist das Sortieren der ursprünglichen Zeilen klarer.

Der Standardmodus ONLY_FULL_GROUP_BY von MySQL lehnt nicht gruppierte Werte ab, die nicht durch die Gruppe bestimmt sind. ANY_VALUE(customer) erlaubt ausdrücklich einen beliebigen Wert, findet aber nicht den Kunden, der zu einer gewählten Summe gehört. SQL Server und Oracle lehnen gewöhnliche nicht gruppierte Spalten ebenfalls ab.

PostgreSQL und MySQL erkennen eine Ausnahme für Primärschlüssel: Die Gruppierung nach dem Primärschlüssel einer Tabelle identifiziert eine einzelne Zeile, sodass deren andere Spalten bestimmt sind. SELECT order_id, customer, SUM(amount) FROM orders GROUP BY order_id funktioniert in PostgreSQL. Alle angezeigten gewöhnlichen Spalten in GROUP BY aufzuführen, bleibt der übertragbare Ansatz.

Wichtige Erkenntnisse

  • Jeder angezeigte Wert muss die ganze Gruppe beschreiben.
  • Eine Spalte zu entfernen, zu gruppieren oder zu aggregieren, beantwortet unterschiedliche Fragen.
  • Die Gruppierungsregel gilt auch für HAVING und ORDER BY in gruppierten Abfragen.
  • Von SQLite akzeptierte nicht aggregierte Spalten können einen fehlerhaften Bericht verbergen.
  • Ein gruppierter Primärschlüssel bestimmt die anderen Spalten seiner Zeile.

2.3 Nach mehreren Spalten und nach berechneten Werten gruppieren

Manche Berichte benötigen eine Kombination von Kategorien oder eine aus jeder Zeile berechnete Kategorie. SQL kann nach mehreren Spalten oder nach einem Ausdruck gruppieren. Entscheidend bleibt, wofür eine Ausgabezeile steht.

Gruppiere nach einer Kombination

GROUP BY region, customer fasst Zeilen nur zusammen, wenn beide Werte übereinstimmen. Führe für die Bestelltabelle aus:

SELECT region, customer, COUNT(*) AS orders, SUM(amount) AS total FROM orders GROUP BY region, customer ORDER BY region, customer;

Die Ergebnisse sind East/Ana: zwei Bestellungen, 165; East/Dara: eine, 95; North/Chen: zwei, 350; West/Ben: zwei, 140; und NULL/Eli: eine, 30. Die beiden Ergebnisse für East ergeben zusammen die regionale Summe von 260.

Die Gruppierung nach customer, region bildet dieselben Kombinationen. Die Spaltenreihenfolge in GROUP BY sortiert die Ausgabe nicht. Das separate ORDER BY oben bestimmt die Anzeige, wobei die Standardposition von NULL von der jeweiligen Datenbank abhängt.

Es erscheinen nur Kombinationen, die in der Eingabemenge vorkommen. Es gibt keine Zeile West/Ana mit der Anzahl null. Die Gruppierung fasst vorhandene Zeilen zusammen; sie erzeugt nicht jede mögliche Paarung von Kategorienamen.

Ergänze Details nur bei Bedarf

Eine zusätzliche Spalte teilt eine Gruppe nur dann auf, wenn deren Zeilen in dieser Spalte unterschiedliche Werte enthalten. Die Gruppierung allein nach Kunde ergibt hier bereits fünf Gruppen. Mit Region sind es weiterhin fünf, weil jeder Kunde nur einen Regionswert hat. Ergänzt man order_date in einem regionalen Bericht, entstehen kleinere Gruppen für die einzelnen Daten und die beantwortete Frage ändert sich.

Gruppiere Datumswerte nach Jahr und Monat

Verwende in SQLite strftime('%Y-%m', order_date), um eine Bezeichnung wie '2026-02' zu erzeugen:

SELECT strftime('%Y-%m', order_date) AS month, COUNT(*) AS orders, SUM(amount) AS total FROM orders GROUP BY strftime('%Y-%m', order_date) ORDER BY month;

Januar hat zwei Bestellungen mit zusammen 200, Februar drei mit zusammen 305 und März drei mit zusammen 275. Ersetze in PostgreSQL für eine DATE-Spalte beide Vorkommen von strftime('%Y-%m', order_date) durch to_char(order_date, 'YYYY-MM').

Eine Gruppierung allein nach der Monatsnummer fasst denselben Monat über mehrere Jahre hinweg zusammen. Januar 2025 und Januar 2026 würden eine Gruppe bilden. Bleibt das Jahr im Gruppierungsausdruck, bleiben die Kalendermonate getrennt.

Die Wiederholung des Ausdrucks in GROUP BY macht die Gruppierung ausdrücklich. SQLite, PostgreSQL und MySQL akzeptieren auch den Ausgabealias, etwa GROUP BY month; SQL Server akzeptiert dort keinen SELECT-Alias derselben Ebene.

Bilde Kategorien mit CASE

Ein CASE-Ausdruck kann jede Bestellung vor der Gruppierung beschriften:

SELECT CASE WHEN amount >= 100 THEN 'large' ELSE 'small' END AS size, COUNT(*) AS orders, SUM(amount) AS total FROM orders GROUP BY CASE WHEN amount >= 100 THEN 'large' ELSE 'small' END;

Die Kategorie large enthält 120, 200 und 150: drei Bestellungen mit zusammen 470. Die Kategorie small enthält fünf Bestellungen mit zusammen 310. Der Schwellenwert ist eingeschlossen, sodass ein Betrag von genau 100 zu 'large' gehört. Derselbe CASE-Ausdruck steht in der Anzeige und in der Gruppierung, sodass beide dieselbe Kategoriedefinition verwenden.

Wichtige Erkenntnisse

  • Mehrere Gruppierungsspalten bestimmen Kombinationen, die in den Daten vorkommen.
  • Eine zusätzliche Spalte teilt nur Gruppen auf, in denen diese Spalte unterschiedliche Werte enthält.
  • Beziehe Jahr und Monat ein, um Kalendermonate getrennt zu halten.
  • Verwende denselben Kategorieausdruck für die ausgewählte Beschriftung und die Gruppierung.
  • GROUP BY erzeugt keine fehlenden Kombinationen mit der Anzahl null.
  • Die Reihenfolge der Gruppierungsspalten steuert nicht die Ausgabereihenfolge.
3

Gruppierte Ergebnisse mit HAVING filtern

Ein Filter kann die Zeilen einer Berechnung verändern oder entscheiden, welche fertigen Zusammenfassungen in einem Bericht erscheinen. Diese Entscheidungen beantworten unterschiedliche Fragen. Du verwendest HAVING, um Gruppen nach Anzahl, Summe oder Durchschnitt zu behalten, und kombinierst es anschließend mit WHERE, ohne die beabsichtigte Bedeutung zu verändern. Die logische Reihenfolge einer Abfrage hilft dir, jede Bedingung richtig zu platzieren und das Ergebnis vor der Ausführung von SQL vorherzusagen.

3.1 Nur die Gruppen behalten, die eine Bedingung erfüllen

HAVING prüft Gruppen, nachdem ihre Aggregate berechnet wurden. Verwende es für eine Anforderung wie „Regionen mit einem Gesamtumsatz über 200“. Die Bedingung beschreibt jede regionale Summe, nicht eine einzelne Bestellung.

Zuerst berechnen, dann Gruppen behalten

SELECT region, COUNT(*) AS orders, SUM(amount) AS total FROM orders GROUP BY region HAVING SUM(amount) > 200;

Vor HAVING lauten die regionalen Summen East 260, North 350, West 140 und NULL 30. Die Bedingung behält East mit drei Bestellungen und North mit zwei. Sie entfernt die beiden anderen Ergebnisgruppen; sie entfernt keine ausgewählten Bestellungen innerhalb von East oder North.

Setze HAVING im geschriebenen SQL nach GROUP BY und vor ORDER BY. Die Sortierung wird dann auf die Gruppen angewendet, die die Bedingung erfüllt haben.

Filtere nach Kennzahlen, die du nicht anzeigst

SELECT region FROM orders GROUP BY region HAVING COUNT(*) >= 2; gibt East, North und West zurück. Die Datenbank kann die Zeilen einer Gruppe zählen, um zu entscheiden, ob sie die Bedingung erfüllt, ohne diese Anzahl anzuzeigen. HAVING und SELECT benötigen keine identischen Aggregatlisten.

Du kannst Gruppenbedingungen verknüpfen. HAVING COUNT(*) >= 2 AND AVG(amount) > 80 behält East und North. East hat drei Bestellungen und einen Durchschnitt von etwa 86,67; North hat zwei und einen Durchschnitt von 175. West hat genügend Bestellungen, aber sein Durchschnitt beträgt nur 70. Beide Prüfungen müssen erfüllt sein, weil sie mit AND verknüpft sind; OR würde das Erfüllen einer der beiden Prüfungen genügen lassen.

Finde wiederholte Werte

Gruppieren und Zählen findet auch Duplikate:

SELECT customer, COUNT(*) AS orders FROM orders GROUP BY customer HAVING COUNT(*) > 1;

Ana, Ben und Chen haben jeweils zwei Bestellungen und erfüllen die Bedingung. Dara und Eli haben jeweils eine und erfüllen sie nicht. Um wiederholte E-Mail-Werte in einer Kundentabelle zu finden, gruppiert dasselbe Muster nach email und behält Anzahlen über eins. Die Anzahl gibt an, wie viele Datensätze diesen Wert teilen.

Verwende den Ausdruck, den die Bedingung benötigt

Wiederhole das Aggregat in HAVING: HAVING SUM(amount) > 200. PostgreSQL und Standard-SQL erlauben den Ausgabealias total in dieser Bedingung auf derselben Ebene nicht, SQLite und MySQL dagegen schon. In einem späteren ORDER BY total DESC kann der Alias verwendet werden.

Ein angezeigter gerundeter Wert und der geprüfte Wert können sich unterscheiden. Der exakte Durchschnitt von East ist 260 geteilt durch drei. Wenn du ROUND(AVG(amount), 2) auswählst, aber HAVING AVG(amount) > 86.67 schreibst, wird East entfernt: Sein ungerundeter Durchschnitt liegt unter 86,67. North bleibt. Die Bedingung verwendet genau den Ausdruck, der in HAVING steht. Nur HAVING ROUND(AVG(amount), 2) ... würde den gerundeten Wert prüfen.

Filtere die einzelne Gesamtgruppe

HAVING kann auch ohne ausdrückliches GROUP BY arbeiten. SELECT COUNT(*) FROM orders HAVING COUNT(*) > 5; behandelt alle acht Bestellungen als eine Gruppe, erfüllt die Bedingung und gibt eine Zeile mit acht zurück. Ersetzt du die Bedingung durch COUNT(*) > 10, erhältst du keine Zeilen, keine Zeile mit null.

PostgreSQL unterstützt dieses Muster ebenso wie SQLite ab Version 3.39.0. In einer älteren SQLite-Installation benötigt eine Abfrage mit HAVING ein ausdrückliches GROUP BY.

Wichtige Erkenntnisse

  • HAVING behält oder entfernt fertig berechnete Gruppen.
  • Ein Aggregat in HAVING muss nicht in SELECT erscheinen.
  • Verknüpfe Gruppenbedingungen mit AND, OR und NOT.
  • Wiederhole für übertragbare Abfragen Aggregatausdrücke in HAVING.
  • Eine Bedingung prüft ihren eigenen Ausdruck, der ungerundet sein kann.

3.2 Zwischen WHERE und HAVING wählen

Eine Bedingung gehört an die Stelle, an der das Beschriebene existiert. Einzelne Bestellungen existieren vor der Gruppierung. Eine regionale Summe existiert erst, nachdem die Bestellungen gruppiert und addiert wurden.

Verfolge die logische Reihenfolge

SQL wird in der Reihenfolge SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT geschrieben. Um das Ergebnis nachzuvollziehen, folge dieser logischen Reihenfolge:

  1. FROM liefert die Zeilen.
  2. WHERE behält passende Zeilen.
  3. GROUP BY bildet Gruppen, und Aggregate berechnen deren Kennzahlen.
  4. HAVING behält passende Gruppen.
  5. SELECT erzeugt die Ausgabewerte; DISTINCT entfernt auf Wunsch doppelte Ausgabezeilen.
  6. ORDER BY sortiert das Ergebnis, und LIMIT behält die gewünschte Anzahl von Zeilen.

Die Datenbank kann ihre interne Ausführung anders anordnen.

Setze jede Bedingung auf die passende Ebene
AnforderungKlausel
Bestellungen mit amount >= 60WHERE
Bestellungen in einem bestimmten DatumsbereichWHERE
Regionen mit SUM(amount) > 200HAVING
Kunden mit mehr als einer BestellungHAVING COUNT(*) > 1

WHERE SUM(amount) > 200 schlägt fehl, weil die Summe beim Filtern der Zeilen noch nicht existiert. Eine Zeilenbedingung wie region = 'East' kann vor der Gruppierung entschieden werden und gehört in WHERE.

Gehe beide Filter durch

SELECT region, COUNT(*) AS orders, SUM(amount) AS total FROM orders WHERE amount >= 60 GROUP BY region HAVING SUM(amount) > 200;

Entferne zuerst die Bestellungen über 45 und 30. East enthält nun 120 und 95, North enthält 200 und 150 und West enthält 80 und 60. Berechne danach die Summen 215, 350 und 140. Behalte zuletzt Summen über 200. Die Ausgabe ist East mit zwei Bestellungen und 215 sowie North mit zwei und 350. Für die NULL-Region bleiben keine Zeilen übrig, sodass sie keine Gruppe bildet.

Verändere beim Verschieben eines Filters nicht die Frage

„Berechne für jede Region den Durchschnitt nur für Bestellungen ab 60“ verwendet WHERE amount >= 60. Der Durchschnitt von East beträgt aus 120 und 95 nun 107,5.

HAVING MIN(amount) >= 60 fragt nach Regionen, in denen jeder Betrag ohne NULL den Schwellenwert erreicht. East wird entfernt, weil sein Minimum 45 ist; North und West bleiben mit ihren ursprünglichen Bestellungen erhalten. Das Verschieben der Bedingung hat die Bedeutung verändert: Statt einzelne Bestellungen auszuwählen, werden ganze Regionen angenommen oder abgelehnt.

Für diesen regionalen Bericht ergibt region <> 'West' in WHERE oder HAVING dasselbe Ergebnis: East und North bleiben, und auch die NULL-Gruppe erfüllt den Vergleich nicht. WHERE formuliert die Zeileneinschränkung direkt und wendet sie vor der Gruppierung an. Um fehlende Regionen ebenfalls zu behalten, benötigt die Bedingung ein ausdrückliches OR region IS NULL.

SELECT-Aliase stehen in PostgreSQL in den früheren Klauseln WHERE und HAVING nicht zur Verfügung. SQLite erlaubt Aliase an mehr Stellen, aber das Ausschreiben der Eingabespalte oder des Ausdrucks macht die beabsichtigte Verarbeitungsstufe deutlich.

Wichtige Erkenntnisse

  • WHERE verändert die Eingaben der Aggregate; HAVING filtert Aggregatergebnisse.
  • Setze Bedingungen für Anzahl, Summe oder Durchschnitt einer Gruppe in HAVING.
  • Verfolge beim Vorhersagen eines Ergebnisses die Zeilenfilterung vor der Gruppierung.
  • Eine Prüfung des Gruppenminimums kann eine ganze Gruppe entfernen.
4

Exakte und sinnvoll gerundete Ergebnisse berechnen

Eine Abfrage kann die richtigen Zeilen auswählen und dennoch den Nachkommateil ihres Ergebnisses verlieren. Zahlentypen steuern die Division und die Ergebnisse von Aggregaten, während die Rundung bestimmt, wie viele Stellen du anzeigst. Du erhältst Nachkommastellen während der Berechnung, wählst einen sinnvollen Umgang mit einem leeren Nenner und rundest nur die endgültige Kennzahl. Derselbe kurze Ausdruck kann sich je nach Datenbank unterschiedlich verhalten, daher wird jeder relevante Unterschied genannt.

4.1 Ganzzahlige Division bei Durchschnitten und Prozentwerten vermeiden

Beim Teilen zweier ganzzahliger Werte kann der Nachkommateil verloren gehen, bevor du das Ergebnis überhaupt anzeigst. Das ist wichtig, wenn du aus Summen und Anzahlen ein arithmetisches Mittel oder einen Prozentwert berechnest.

Sorge vor der Division für einen Dezimaloperanden

In SQLite und PostgreSQL gibt 7 / 2 3 zurück. Bei ganzzahliger Eingabe gibt SUM(quantity) / COUNT(*) für die Bestelltabelle 2 zurück: Bei 19 Artikeln geteilt durch acht Bestellungen geht der Nachkommateil verloren. PostgreSQLs SUM einer INTEGER-Spalte gibt BIGINT zurück, sodass hier weiterhin ganzzahlig dividiert wird.

Schreibe 1.0 * SUM(quantity) / COUNT(*), um in beiden Datenbank-Engines 2,375 zu erhalten. Die Multiplikation mit 1,0 erzeugt vor der Division einen Dezimaloperanden. SUM(quantity) / COUNT(*) * 1.0 ergibt 2,0, weil die Division den Nachkommateil bereits abgeschnitten hat. Operationen mit demselben Rang werden von links nach rechts ausgewertet.

Für diese Tabelle ergibt AVG(quantity) in SQLite und PostgreSQL direkt 2,375. Die von Hand geschriebene Formel ist wichtig, wenn du einen anderen Nenner oder einen Prozentwert benötigst.

Berechne einen Prozentwert

Drei der acht Bestellungen haben Beträge von mindestens 100. Die Anzahl dieser Bestellungen geteilt durch die Anzahl aller Bestellungen ergibt ihren Anteil. Multipliziere mit 100,0:

SELECT 100.0 * COUNT(CASE WHEN amount >= 100 THEN 1 END) / COUNT(*) AS pct_large FROM orders;

Das Ergebnis ist 37,5. Verwendest du stattdessen die ganze Zahl 100, ergibt sich in SQLite und bei ganzzahliger Division der Anzahlen in PostgreSQL 37. Nachträgliches Runden würde nur ändern, wie 37 angezeigt wird.

Eine Abfrage über die ganze Tabelle kann keine passenden Zeilen finden. NULLIF(COUNT(*), 0) gibt NULL zurück, wenn die Anzahl null ist, sodass 100.0 * COUNT(discount) / NULLIF(COUNT(*), 0) bei leerer Eingabemenge NULL zurückgibt. Ein ungeschützter Nenner von null löst in PostgreSQL einen Fehler aus; SQLite gibt NULL zurück. Ein NULL-Anteil kann klar für „keine Bestellungen zur Auswertung“ stehen.

Prüfe die Datenbank und den Eingabetyp
DatenbankVerhalten, auf das du achten musst
SQLiteGanzzahlige Division schneidet den Nachkommateil ab; AVG gibt eine Gleitkommazahl zurück.
PostgreSQLGanzzahlige Division schneidet den Nachkommateil ab; AVG gibt bei ganzzahliger oder NUMERIC-Eingabe NUMERIC zurück.
SQL ServerGanzzahlige Division schneidet den Nachkommateil ab; AVG gibt bei ganzzahliger Eingabe eine ganze Zahl zurück.
MySQL und Oracle/ erhält bei ganzzahligen Operanden den Nachkommateil des Ergebnisses.

Verwende in SQL Server AVG(quantity * 1.0) oder wandle die Eingaben vor der Durchschnittsberechnung in DECIMAL um. In PostgreSQL gibt SUM einer BIGINT-Spalte NUMERIC zurück, sodass sich die Division nicht wie bei SUM einer INTEGER-Spalte verhalten muss. MySQL gibt für Summen ganzzahliger Eingaben DECIMAL zurück.

Auch eine explizite Typumwandlung kann den benötigten Dezimaloperanden erzeugen: Verwende CAST(SUM(quantity) AS REAL) in SQLite oder CAST(SUM(quantity) AS NUMERIC) in PostgreSQL. Die Umwandlung in NUMERIC kann in SQLite eine ganze Zahl erhalten, sodass diese Umwandlung allein keine Dezimaldivision sicherstellt.

Unterscheide exakte Dezimalzahlen von Näherungswerten

Gleitkommatypen speichern binäre Näherungswerte. PostgreSQLs NUMERIC und DECIMAL unterstützen exakte Dezimalwerte; Additionen mit Gleitkommazahlen können kleine Abweichungen wie 0,30000000000000004 anzeigen. SQLites NUMERIC-Affinität bietet keine exakte Dezimalspeicherung. Für exakte Geldsummen speichere dort ganzzahlige Centbeträge, addiere sie und teile zur Anzeige durch 100,0.

Wichtige Erkenntnisse

  • Erzeuge einen Dezimaloperanden, bevor du ganzzahlige Summen oder Anzahlen dividierst.
  • Eine Multiplikation nach der ganzzahligen Division kann verlorene Stellen nicht zurückbringen.
  • Verwende NULLIF, um einen Nenner von null zu behandeln.
  • Die Ergebnistypen von Aggregaten hängen sowohl von der Datenbank-Engine als auch vom Eingabetyp ab.
  • Die NUMERIC-Affinität von SQLite bietet keine exakte Dezimalspeicherung.
  • SQL Server benötigt Dezimaleingaben, damit der Durchschnitt ganzer Zahlen einen Nachkommateil haben kann.

4.2 Aggregierte Ergebnisse runden

Runden bestimmt, wie viele Stellen ein Ergebnis zeigt. Runde erst im letzten Schritt, damit die Darstellung die berechnete Kennzahl nicht verändert.

Runde ein Aggregatergebnis

ROUND(x, n) rundet auf n Stellen nach dem Komma. ROUND(x) rundet auf eine ganze Zahl. Zum Beispiel ist ROUND(3.14159, 2) gleich 3,14.

SELECT region, ROUND(AVG(amount), 2) AS avg_amount FROM orders GROUP BY region; ergibt East 86,67, North 175, West 70 und für die NULL-Region 30. SQLite zeigt möglicherweise 175,0 an, während das NUMERIC-Ergebnis von PostgreSQL 175,00 anzeigt. Beide stehen für dieselbe Zahl. Eine Zahl zu runden und eine Textbeschriftung mit fester Breite zu formatieren, sind unterschiedliche Aufgaben.

Runde nach dem Addieren oder Mitteln

Addiere bei drei Gebühren von 0,44 zuerst zu 1,32 und runde dann auf eine Nachkommastelle, um 1,3 zu erhalten. ROUND(SUM(fee), 1) folgt dieser Reihenfolge. SUM(ROUND(fee, 1)) rundet jede Gebühr auf 0,4 und addiert sie dann, was 1,2 ergibt. Das frühe Runden hat die Summe verändert.

Ebenso ergibt ROUND(100 * 1 / 3, 1) in SQLite und PostgreSQL 33,0, weil die ganzzahlige Division bereits 33 erzeugt hat. ROUND(100.0 * 1 / 3, 1) erhält den Nachkommateil und ergibt 33,3. Wähle den Berechnungstyp vor dem Runden.

Gerundete Anteile ergeben zusammen möglicherweise nicht 100 %. Drei gleiche Anteile können jeweils als 33,3 % angezeigt werden und zusammen 99,9 % ergeben. Die zugrunde liegenden Anteile ergeben weiterhin das Ganze. Berechnest du einen beliebigen Anteil neu, um die angezeigte Summe zu erzwingen, änderst du die Bedeutung dieser angezeigten Zahl.

Verwende einen unterstützten Eingabetyp

PostgreSQL unterstützt ROUND(value, n) mit zwei Argumenten für NUMERIC. Wenn temp vom Typ DOUBLE PRECISION ist, schreibe ROUND(CAST(AVG(temp) AS NUMERIC), 2). Der Durchschnitt von 20,5, 21,25 und 19,0 ist 20,25, und die Typumwandlung ermöglicht das Runden mit zwei Argumenten. Bei ganzzahligem amount ist der Durchschnitt in PostgreSQL bereits NUMERIC, sodass keine Typumwandlung nötig ist.

Bei exakten NUMERIC-Werten rundet PostgreSQL Rundungsgrenzfälle von null weg: 2,5 wird zu 3 und -2,5 wird zu -3. SQLite ergibt bei diesen Beispielen ebenfalls 3,0 und -3,0. Das Runden von Gleitkommazahlen in PostgreSQL hängt von der Plattform ab; häufig wird zur nächsten geraden Zahl gerundet. Durch binäre Näherung kann eine Dezimalzahl auch knapp unter einem vorgesehenen Rundungsgrenzfall liegen. Verwende einen bestimmten Gleitkomma-Grenzfall nicht als allgemeine Regel für exakte Dezimalarithmetik.

Beachte zwei weitere Dialektunterschiede

PostgreSQL, MySQL, SQL Server und Oracle verwenden eine negative Anzahl von Dezimalstellen, um links vom Komma zu runden. ROUND(1234.5, -2) ergibt 1200. SQLite behandelt ein negatives zweites Argument als null und ergibt 1235,0. Um in SQLite auf Hunderter zu runden, verwende ROUND(x / 100.0) * 100.

Auch die Umwandlung in eine ganze Zahl ist datenbankspezifisch: SQLite schneidet den Nachkommateil ab, sodass 2,9 zu 2 wird; PostgreSQL rundet den Wert auf 3. Verwende ROUND, wenn gerundet werden soll. PostgreSQLs TRUNC(x, n) schneidet dagegen Stellen ab: TRUNC(2.97, 1) ist 2,9, während das Runden auf eine Nachkommastelle 3,0 ergibt.

Wichtige Erkenntnisse

  • Runde das Aggregatergebnis nach Abschluss seiner Berechnung.
  • Runden kann eine vorherige ganzzahlige Division nicht korrigieren.
  • Gerundete Prozentwerte können zusammen 99,9 % oder 100,1 % ergeben.
  • Wandle einen Gleitkommadurchschnitt in PostgreSQL für ROUND mit zwei Argumenten in NUMERIC um.
  • Negative Rundungsstellen und Umwandlungen in ganze Zahlen unterscheiden sich zwischen Datenbanken.
5

Geschäftliche Fragen mit zusammenfassenden Abfragen beantworten

Geschäftsberichte benötigen oft mehrere Kennzahlen für dieselbe Grundgesamtheit: alle Bestellungen, große Bestellungen und den Anteil der großen Bestellungen. Bedingte Aggregation hält diese Kennzahlen nebeneinander. Anschließend erstellst du aus einer Frage einen vollständigen Bericht, prüfst Summen und fehlende Kategorien und verwendest einen zweiten Aggregationsschritt, wenn sich die Frage auf Kunden oder andere Gruppen statt auf einzelne Bestellungen bezieht.

5.1 Mit CASE bedingt zählen und summieren

Bedingte Aggregation ermöglicht unterschiedliche Beiträge zu verschiedenen Kennzahlen, während dieselben Zeilen insgesamt erhalten bleiben. Ein CASE-Ausdruck entscheidet, was jede Zeile zu einer Anzahl oder Summe beiträgt.

Zähle passende Zeilen

COUNT(CASE WHEN amount >= 100 THEN 1 END) zählt Bestellungen ab 100. Der Ausdruck gibt bei einem Treffer 1 und für andere Zeilen NULL zurück, weil er kein ELSE hat. COUNT überspringt diese NULL-Werte, sodass in der Bestelltabelle drei Treffer bleiben.

SUM(CASE WHEN amount >= 100 THEN 1 ELSE 0 END) zählt Treffer, indem Einsen und Nullen addiert werden. Bei vorhandenen Eingabezeilen ergibt sich dieselbe Anzahl. Für COUNT(CASE WHEN amount >= 100 THEN 1 ELSE 0 END) gilt das nicht: Sowohl 1 als auch 0 sind nicht NULL, sodass alle acht Bestellungen gezählt werden.

Addiere passende Beträge

Gib für eine bedingte Summe den Betrag selbst zurück:

SELECT region, COUNT(*) AS orders, COUNT(CASE WHEN amount >= 100 THEN 1 END) AS large_orders, SUM(CASE WHEN amount >= 100 THEN amount ELSE 0 END) AS large_total FROM orders GROUP BY region;

East hat drei Bestellungen, eine große Bestellung und eine Summe großer Bestellungen von 120. North hat zwei Bestellungen, beide groß, mit zusammen 350. West hat zwei Bestellungen, keine großen Bestellungen und eine Summe großer Bestellungen von null. Die NULL-Regionsgruppe hat eine Bestellung und für beide Kennzahlen zu großen Bestellungen jeweils null.

Die Ausgabe behält West, weil seine Eingabezeilen weiterhin existieren. Ein zusätzliches WHERE amount >= 100 würde die Zeilen von West vor der Gruppierung entfernen, sodass West verschwände. Dieser Filter würde außerdem bewirken, dass COUNT(*) nur große Bestellungen zählt, wodurch der Vergleich mit allen Bestellungen verloren ginge.

Verwende den richtigen Nenner

Berechne innerhalb jeder Region den Prozentsatz großer Bestellungen mit ROUND(100.0 * COUNT(CASE WHEN amount >= 100 THEN 1 END) / COUNT(*), 1) AS pct_large. East ergibt 33,3, North 100,0, West 0,0 und die NULL-Gruppe 0,0. Jeder Nenner ist die Bestellanzahl der jeweiligen Gruppe, nicht die Anzahl von acht für die ganze Tabelle.

Schütze bei einem nicht gruppierten Bericht, der keine Zeilen enthalten kann, den Nenner mit NULLIF(COUNT(*), 0). Eine Zählung bei leerer Eingabemenge ergibt null, aber für den Prozentwert einer leeren Grundgesamtheit gibt es keinen Nenner.

Erstelle mehrere Kategoriespalten

Ein einzelnes Ergebnis kann eine Anzahl pro Region zeigen:

SELECT COUNT(CASE WHEN region = 'East' THEN 1 END) AS east, COUNT(CASE WHEN region = 'West' THEN 1 END) AS west, COUNT(CASE WHEN region = 'North' THEN 1 END) AS north FROM orders;

Die Anzahlen sind drei, zwei und zwei. Elis Bestellung gehört zu keiner dieser Prüfungen auf eine benannte Region. Ergänze COUNT(CASE WHEN region IS NULL THEN 1 END), um die eine Bestellung ohne Region zu zählen. Der Vergleich einer NULL-Region mit einem Namen ergibt keine wahre Bedingung.

Erkenne alternative Schreibweisen

PostgreSQL und SQLite ab Version 3.30.0 unterstützen COUNT(*) FILTER (WHERE amount >= 100). Der Filter gilt für dieses Aggregat, sodass ein benachbartes ungefiltertes COUNT(*) weiterhin alle Bestellungen zählt. MySQL und SQL Server unterstützen diese FILTER-Schreibweise für Aggregate nicht; die CASE-Form funktioniert auf beiden.

SQLite und MySQL erlauben auch SUM(amount >= 100), weil Vergleiche numerische Wahrheitswerte erzeugen. PostgreSQL lehnt SUM für boolesche Werte ab. Verwende die CASE-Form, wenn eine Abfrage auf diesen Datenbank-Engines funktionieren soll.

Wichtige Erkenntnisse

  • Setze Bedingungen in Aggregate, um Kennzahlen für verschiedene Teilmengen zusammenzuhalten.
  • COUNT(CASE ... THEN 1 END) überspringt Zeilen ohne Treffer.
  • ELSE 0 funktioniert für eine bedingte Summe, bewirkt aber bei einer bedingten Zählung, dass auch Zeilen ohne Treffer zählen.
  • Ein Prozentanteil in der Gruppe verwendet die Grundgesamtheit dieser Gruppe als Nenner.
  • Eine FILTER-Klausel für ein Aggregat verändert nur dessen Eingaben.
  • Verwende IS NULL, um fehlende Kategorien gesondert zu zählen.

5.2 Aus einer Frage eine zusammenfassende Abfrage erstellen und prüfen

Eine zusammenfassende Abfrage beginnt mit einer Frage zu einer Grundgesamtheit auf einer bestimmten Detailebene. Übersetze diese Entscheidungen, bevor du SQL schreibst, und prüfe dann, ob die Ausgabe weiterhin die ursprüngliche Frage beantwortet.

Erstelle den Bericht der Reihe nach

Frag dich: „Wie viele Bestellungen wurden in jedem Monat des Jahres 2026 mit mindestens drei Bestellungen aufgegeben, und wie hoch war der durchschnittliche Betrag auf zwei Nachkommastellen?“

  1. Die Kennzahlen sind COUNT(*) und AVG(amount).
  2. Die Granularität, also die Bedeutung einer Ergebniszeile, ist ein Kalendermonat.
  3. Die Zeilenbedingung behält Datumswerte aus 2026.
  4. Die Gruppenbedingung verlangt mindestens drei Bestellungen.
  5. Die Ausgabe soll nach Monat sortiert und der Durchschnitt für die Anzeige gerundet werden.

In SQLite:

SELECT strftime('%Y-%m', order_date) AS month, COUNT(*) AS orders, ROUND(AVG(amount), 2) AS avg_amount FROM orders WHERE order_date >= '2026-01-01' AND order_date < '2027-01-01' GROUP BY strftime('%Y-%m', order_date) HAVING COUNT(*) >= 3 ORDER BY month;

Ersetze für PostgreSQL-Datumswerte den Monatsausdruck an beiden Stellen durch to_char(order_date, 'YYYY-MM'). Der Datumsbereich schließt den Beginn von 2026 ein und den Beginn von 2027 aus.

Januar hat zwei Bestellungen und erfüllt die Gruppenbedingung nicht. Februar hat drei Bestellungen mit zusammen 305 und einem Durchschnitt von 101,67. März hat drei mit zusammen 275 und einem Durchschnitt von 91,67. Auf die verbleibenden Gruppen entfallen sechs Bestellungen, nicht acht, weil HAVING den Januar entfernt hat.

Prüfe, bevor du Gruppen herausfilterst

Führe den Bericht zuerst ohne HAVING aus. Die Anzahlen aller Gruppen sollten zusammen der Zeilenanzahl unter demselben WHERE-Filter entsprechen und die Summen zusammen der nicht gruppierten Summe. Hier ergeben diese Prüfungen acht und 780. Vergleiche die Summen der beibehaltenen Gruppen nicht mit der gesamten Eingabemenge, nachdem Gruppen ausgeschlossen wurden.

Suche nach einer NULL-Gruppe, prüfe die Reihenfolge der Ergebnisse und berechne eine Gruppe nach, indem du die Rohtabelle filterst. Für East sollte WHERE region = 'East' drei Bestellungen mit zusammen 260 ergeben. Eine Abweichung kann eine zusätzliche Gruppierungsspalte, einen falsch platzierten Zeilenfilter oder einen Ausdruck aufdecken, der zu NULL wurde.

Unterscheide eine durchschnittliche Bestellung von einem durchschnittlichen Kunden

AVG(amount) beträgt 97,5 pro Bestellung. Die durchschnittlichen Ausgaben pro Kunde beziehen sich auf eine andere Einheit: Die fünf Kundensummen sind 165, 140, 350, 95 und 30. Ihr Durchschnitt ist 156.

Berechne das in zwei Stufen:

SELECT AVG(total) AS avg_customer_total FROM (SELECT customer, SUM(amount) AS total FROM orders GROUP BY customer) AS per_customer;

Die innere Abfrage erzeugt eine Zeile pro Kunde. Die äußere Abfrage bildet den Durchschnitt dieser Zeilen, sodass jeder Kunde einen Beitrag leistet. Sind alle Kunden benannt, ergibt 1.0 * SUM(amount) / COUNT(DISTINCT customer) dieselbe Zahl 156. Bei unterschiedlichen Bestellanzahlen ist die Durchschnittsbildung über Bestellbeträge eine andere Berechnung.

Fasse die Gruppen selbst zusammen

Um Kunden mit mehr als einer Bestellung zu zählen, liste sie zunächst auf und zähle dann ihre Zeilen:

SELECT COUNT(*) FROM (SELECT customer FROM orders GROUP BY customer HAVING COUNT(*) > 1) AS repeat_customers;

Die Antwort ist drei. Die direkte Verschachtelung von Aggregaten wie in MAX(AVG(amount)) auf einer Abfrageebene schlägt in SQLite und PostgreSQL fehl. Um die Region mit dem höchsten Durchschnitt zu finden, sortiere die gruppierten Durchschnitte: ORDER BY AVG(amount) DESC LIMIT 1 gibt North mit 175 zurück. Oracle unterstützt auch verschachtelte Gruppenfunktionen, aber eine separate Abfrageebene macht die beiden Berechnungen ausdrücklich. Prüfe gleiche Werte, wenn ein Bericht nach dem höchsten Ergebnis fragt.

Wichtige Erkenntnisse

  • Leite Kennzahlen, Granularität, Zeilenbedingungen und Gruppenbedingungen aus der Frage ab.
  • Prüfe Gruppenanzahlen und -summen, bevor du Gruppen mit HAVING entfernst.
  • Ein Durchschnitt pro Kunde benötigt Kundensummen als Eingabewerte.
  • Verwende eine innere gruppierte Abfrage und ein äußeres Aggregat, um Gruppen zusammenzufassen.

SQL-Aggregation: Beispiele

5 Interaktive Lektionen

1

Aus Bestellzeilen zuverlässige zusammenfassende Zahlen gewinnen

13 Schritte
Wähle Aggregate und Zählweisen und verfolge dann die Auswirkungen fehlender Werte.
  1. 1
    EinführungLies die Frage für den Bericht

    Eine Führungskraft möchte eine Bestellsumme, eine Kundenanzahl und einen durchschnittlichen Rabatt. Jede Größe klingt nach einer einfachen Zahl, verwendet die Eingabe aber anders. Jede ist ein Aggregat, das viele Zeilen in einen Wert überführt, und eine falsche Wahl ergibt eine irreführende Zahl. Wir bilden diese Kennzahlen aus den acht Bestellungen: zuerst Beträge zusammenfassen, dann die Zählweise wählen und anschließend entscheiden, wie NULL den Durchschnitt verändert. Frag dich immer wieder, was eine Eingabezeile zum Ergebnis beiträgt.

  2. 2
    ErklärungFasse die Beträge zusammen

    Ein Aggregat fasst Werte aus vielen Zeilen zu einem Ergebnis zusammen. SUM(amount) addiert die Beträge, AVG(amount) ermittelt ihren Durchschnitt und MIN(amount) und MAX(amount) bestimmen die Extremwerte. Ohne GROUP BY bilden alle passenden Bestellungen eine Gruppe. Du kannst mehrere Aggregate zusammen auswählen, weil jedes dieselbe Gruppe von Eingabezeilen beschreibt.

  3. 3
    BeispielBerechne eine vollständige Zusammenfassung

    Die Bestellbeträge sind 120, 80, 45, 200, 60, 95, 150 und 30. Sie ergeben zusammen 780. Teilt man diese Summe durch acht, ergibt sich ein Durchschnitt von 97,5; der kleinste Wert ist 30 und der größte 200.

    SELECT SUM(amount) AS total, AVG(amount) AS mean_amount, MIN(amount) AS low, MAX(amount) AS high FROM orders;

    Die Ausgabe ist eine Zeile mit vier beschrifteten Kennzahlen.

  4. 4
    BeispielWähle die Eingabe vor dem Addieren

    Frage nun nur nach East. WHERE region = 'East' behält die Beträge 120, 45 und 95, bevor das Aggregat berechnet wird.

    SELECT SUM(amount) AS total FROM orders WHERE region = 'East';

    Die Ausgabe ist 260. Die anderen Regionen tragen nichts bei, weil ihre Bestellungen die Zeilenbedingung nicht erfüllen. Ein Filter auf Eingabezeilen verändert die Summe selbst, nicht nur ihre angezeigte Beschriftung.

  5. 5
    HerausforderungHalte eine Menge mit ihrem Preis zusammen

    Eine Verkaufstabelle hat zwei Zeilen: Menge 4 zum Stückpreis 6 und Menge 2 zum Stückpreis 9. Was gibt SUM(quantity * unit_price) zurück, und warum ist die Multiplikation der beiden Summen etwas anderes?

    ---reveal---

    Die Zeilenumsätze sind 24 und 18, die Summe ist also 42. Die Multiplikation der Summen ergibt sechs mal 15, also 90, weil dabei nicht mehr jede Menge dem Preis ihrer eigenen Zeile zugeordnet wird.

  6. 6
    ErklärungZähle Datensätze oder Kunden

    Die Bestellungen nennen Ana, Ben, Ana, Chen, Ben, Dara, Chen und Eli. COUNT(customer) zählt acht erfasste Namen einschließlich wiederholter Vorkommen. COUNT(DISTINCT customer) zählt fünf verschiedene Namen.

    Die Formulierung entscheidet, was passt: Eine Bestellanzahl benötigt Zeilen, eine Kundenanzahl unterschiedliche Kunden. Gleiche Namen auf separaten Bestellungen sind erwartete Wiederholungen, keine zusätzlichen Kunden.

  7. 7
    BeispielZähle die fehlende Kategorie

    Die Regionsspalte hat acht Zeilen, aber nur sieben erfasste Werte. COUNT(*) ist acht, COUNT(region) ist sieben und COUNT(DISTINCT region) ist drei.

    Zieht man die Anzahl erfasster Werte von der Zeilenanzahl ab, ergibt sich eine fehlende Region. Beachte, dass eine Liste unterschiedlicher Regionen auch eine NULL-Zeile enthalten würde; die Zählung unterschiedlicher Werte ignoriert dieses NULL, statt es als vierte benannte Region zu behandeln.

  8. 8
    HerausforderungWähle die richtige Zählweise

    Eine Gutscheinspalte enthält NULL, 0, 8, 8 und 0. Welche Werte geben COUNT(*), COUNT(coupon) und COUNT(DISTINCT coupon) in dieser Reihenfolge zurück?

    ---reveal---

    Sie geben fünf, vier und zwei zurück. Es gibt fünf Zeilen, vier erfasste Werte und zwei unterschiedliche erfasste Werte, 0 und 8. Erfasste Nullwerte zählen; NULL geht in keine der beiden Spaltenzählungen ein.

  9. 9
    ErklärungLass eine unbekannte Punktzahl weg

    Betrachte die Punktzahlen 80, NULL, 70 und 90. Die erfassten Punktzahlen ergeben zusammen 240. AVG(score) teilt durch die drei erfassten Punktzahlen und gibt 80 zurück.

    Es teilt nicht durch alle vier Zeilen: Eine fehlende Punktzahl ist keine bekannte Null. Steht der fehlende Wert für eine versäumte Prüfung, die mit null Punkten bewertet werden soll, ändert sich die beabsichtigte Berechnung zu AVG(COALESCE(score, 0)), was 60 ergibt.

  10. 10
    BeispielSetze den Ersatzwert an der richtigen Stelle ein

    Bei vier Bestellungen fehlt der Rabatt. In SUM(amount - discount) wird jeder dieser Zeilenausdrücke zu NULL, sodass nur die anderen vier beitragen. Ihre Nettobeträge ergeben zusammen 345.

    Wenn fehlend bedeutet, dass kein Rabatt gewährt wurde, verwende SUM(amount - COALESCE(discount, 0)). Dann tragen alle acht Bestellungen bei und die Summe beträgt 750. COALESCE um die fertige Summe kann ausgelassene Zeilenbeiträge nicht zurückbringen.

  11. 11
    HerausforderungBehandle eine Gruppe ohne bekannte Werte

    Eine Abfrage behält drei Zeilen, deren Beträge alle NULL sind. Was geben COUNT(*), COUNT(amount) und SUM(amount) zurück?

    ---reveal---

    Sie geben drei, null und NULL zurück. Es gibt Zeilen, aber keine erfassten Beträge zum Zählen oder Addieren. Eine leere Eingabemenge würde ebenfalls eine NULL-Summe ergeben, aber ihre Zeilenanzahl wäre null. Verwende COALESCE(SUM(amount), 0) nur, wenn der Bericht diese fehlende Summe als null anzeigen soll.

  12. 12
    HerausforderungPrüfe eine Berechnung und ihre Grundgesamtheit

    Vier Leistungsdatensätze haben Beträge von 20, 30, 40 und 50 sowie Gutschriften von 2, NULL, 0 und NULL. Eine fehlende Gutschrift bedeutet, dass keine Gutschrift vorliegt. Welchen Nettogesamtbetrag und welche Anzahl erfasster Gutschriften sollte der Bericht zeigen?

    ---reveal---

    Verwende SUM(charge - COALESCE(credit, 0)) für einen Nettogesamtbetrag von 138 und COUNT(credit) für zwei erfasste Gutschriften. Die Gutschrift von null zählt als erfasst; das Ersetzen von NULL innerhalb der Summe erhält alle vier Beträge.

  13. 13
    ZusammenfassungBeziehe die Kennzahl auf ihre Eingaben

    Wähle das Aggregat anhand der Frage und verfolge dann die Werte, die eingehen. Zählungen unterscheiden Zeilen, erfasste Einträge und unterschiedliche Einträge. Prüfe bei Durchschnitten und Rechnungen pro Zeile, was NULL entfernt und ob eine Ersetzung eine tatsächliche Bedeutung hat. Wenn ein Ergebnis überraschend aussieht, untersuche die verbleibenden Zeilen und ihre Beiträge, bevor du das SQL änderst.

2

Erstelle einen Bericht auf der richtigen Detailebene

14 Schritte
Gruppiere nach Kategorien, korrigiere mehrdeutige Spalten und erstelle kombinierte oder berechnete Gruppen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEntscheide, wofür eine Ergebniszeile steht
  2. 2
    ErklärungFasse Zeilen nach Region zusammen
  3. 3
    BeispielHalte die NULL-Gruppe sichtbar
  4. 4
    TippSortiere, bevor du die ersten Zeilen behältst
  5. 5
    HerausforderungSage voraus, wie viele Gruppen bleiben
  6. 6
    ErklärungErkläre, warum ein Name mehrdeutig ist
  7. 7
    BeispielKorrigiere den Bericht anhand seiner Frage
  8. 8
    TippErkenne ein Ergebnis aus nachgiebiger Verarbeitung
  9. 9
    HerausforderungWähle eine sinnvolle Korrektur
  10. 10
    BeispielTeile eine Gruppe nach einem zweiten Wert auf
  11. 11
    ErklärungErstelle eine Kalendermonatsbezeichnung
  12. 12
    HerausforderungFinde den Gruppierungsausdruck
  13. 13
    HerausforderungPrüfe Granularität und Beschriftungen des Berichts
  14. 14
    ZusammenfassungLies jede Zeile als eine Gruppe
3

Filter vor oder nach der Aggregation platzieren

10 Schritte
Verfolge WHERE und HAVING in einem Bericht und sage voraus, wie ihre Platzierung die Antwort verändert.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungTrenne Grundgesamtheit und Auswahl
  2. 2
    ErklärungPrüfe die fertig berechnete Gruppe
  3. 3
    BeispielVerwende eine Anzahl, ohne sie anzuzeigen
  4. 4
    HerausforderungPrüfe den tatsächlich verglichenen Wert
  5. 5
    ErklärungVerfolge die logischen Stufen des Ergebnisses
  6. 6
    BeispielEntferne zuerst kleine Bestellungen
  7. 7
    BeispielEntferne dann kleine Gruppensummen
  8. 8
    HerausforderungErkenne eine veränderte Frage
  9. 9
    HerausforderungKombiniere Zeilen- und Gruppeneinschränkungen
  10. 10
    ZusammenfassungOrdne die Bedingung ihrer Stufe zu
4

Nachkommateile erhalten und das Endergebnis runden

11 Schritte
Verfolge numerische Typen, vermeide Nenner von null und runde Aggregate auf der richtigen Stufe.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungHalte Berechnung und Anzeige getrennt
  2. 2
    BeispielFinde, wo der Nachkommateil verschwindet
  3. 3
    ErklärungFühre die Dezimalzahl früh ein
  4. 4
    TippSichere einen leeren Nenner ab
  5. 5
    HerausforderungKorrigiere einen Prozentwertausdruck
  6. 6
    ErklärungRunde den fertig berechneten Durchschnitt
  7. 7
    BeispielSieh, wie frühes Runden eine Summe verändert
  8. 8
    HerausforderungPrüfe einen Dialektunterschied
  9. 9
    VerbindungWähle den Typ für exakte Beträge
  10. 10
    HerausforderungPrüfe den Typ vor dem Runden
  11. 11
    ZusammenfassungVerfolge die Zahl durch jede Stufe
5

Eine geschäftliche Zusammenfassung erstellen und prüfen

13 Schritte
Erstelle Kennzahlen für Teilmengen, wähle die Granularität eines Berichts und fasse Gruppenergebnisse auf zwei Abfrageebenen zusammen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungHalte alle und ausgewählte Bestellungen zusammen
  2. 2
    ErklärungLass Zeilen ohne Treffer NULL beitragen
  3. 3
    BeispielHalte die vollständige Gruppe verfügbar
  4. 4
    BeispielAddiere den Betrag oder addiere eins
  5. 5
    HerausforderungErhalte den Nenner für eine Teilmenge
  6. 6
    ErklärungÜbersetze die geschäftliche Formulierung
  7. 7
    BeispielErstelle das monatliche Ergebnis
  8. 8
    TippPrüfe, bevor du Gruppen ausblendest
  9. 9
    ErklärungÄndere die Eingabeeinheit für einen Durchschnitt
  10. 10
    BeispielLies die beiden Abfrageebenen
  11. 11
    HerausforderungWähle die richtige Einheit für den Durchschnitt
  12. 12
    HerausforderungZähle nur passende Kundengruppen
  13. 13
    ZusammenfassungPrüfe Grundgesamtheit und Granularität

SQL-Aggregation: Übungsaufgaben

40 Übungsfragen in 4 Sets

Set 1: Anzahlen, Gruppen und Berechnungen lesen10 Übungsfragen

Frage 1 von 10

Eine Liefertabelle erfasst Entfernungen von 14, 22 und 35. Welchen Wert gibt SUM(distance) zurück?
  1. 35
  2. 23.67
  3. 71
  4. 3
Antwort zeigenAntwort ausblenden
Antwort: C
SUM addiert die drei Entfernungen und ergibt 71. Die größte Entfernung, 35, wäre das Ergebnis von MAX(distance), während ein Durchschnitt die Gesamtentfernung durch drei teilen würde; keines von beiden beantwortet die Frage nach einer Summe.

Frage 2 von 10

Fünf Anfragen haben die Statuswerte closed, open, closed, open und open. Was gibt COUNT(CASE WHEN status = 'closed' THEN 1 ELSE 0 END) zurück?
  1. 5
  2. 2
  3. 3
  4. 0
Antwort zeigenAntwort ausblenden
Antwort: A
Jedes CASE-Ergebnis ist ein erfasster Wert: Geschlossene Anfragen ergeben 1 und offene Anfragen 0. COUNT zählt beides und ergibt fünf. Um nur die zwei geschlossenen Anfragen zu zählen, lass ELSE weg, sodass nicht passende Zeilen NULL ergeben, oder addiere stattdessen die Eins- und Nullindikatoren mit SUM.

Frage 3 von 10

Vier Lieferungen haben Verspätungen von 6, NULL, 10 und 8 Minuten. Eine fehlende Verspätung bedeutet, dass sie nicht gemessen wurde. Welchen Durchschnitt gibt AVG(delay) zurück?
  1. 6
  2. 24
  3. 10
  4. 8
Antwort zeigenAntwort ausblenden
Antwort: D
Die drei gemessenen Verspätungen ergeben zusammen 24 Minuten, und AVG teilt durch ihre Anzahl von drei, was acht Minuten ergibt. Eine Division durch alle vier Zeilen würde sechs Minuten ergeben und die unbekannte Verspätung damit durch null ersetzen, obwohl keine solche Messung erfasst wurde.

Frage 4 von 10

Eine Schichttabelle enthält die Abteilungswerte Sales, Support, Sales, NULL und NULL. Wie viele Zeilen gibt SELECT department, COUNT(*) FROM shifts GROUP BY department zurück?
  1. 5
  2. 3
  3. 2
  4. 4
Antwort zeigenAntwort ausblenden
Antwort: B
Die Abfrage bildet eine Gruppe für Sales, eine für Support und eine für den fehlenden Abteilungswert und gibt daher drei Zeilen zurück. NULL-Gruppierungswerte gehören zusammen; würde man jeden NULL-Wert als eigene Gruppe behandeln, entstünde eine zusätzliche Ergebniszeile, die SQL nicht erzeugt.

Frage 5 von 10

Eine Teiletabelle hat mehrere Lieferanten pro Kategorie. Der Bericht benötigt eine Zeile pro Kategorie und die Anzahl ihrer unterschiedlichen Lieferanten. Welche SELECT-Liste passt zu FROM parts GROUP BY category?
  1. category, supplier, COUNT(*)
  2. category, COUNT(DISTINCT supplier)
  3. category, COUNT(supplier)
  4. category, MIN(supplier)
Antwort zeigenAntwort ausblenden
Antwort: B
COUNT(DISTINCT supplier) fasst alle erfassten Lieferantenwerte einer Kategorie zu einer Anzahl unterschiedlicher Lieferanten zusammen. Ein gewöhnlicher Lieferantenwert ist mehrdeutig, weil die Kategorie mehrere Lieferanten haben kann. COUNT(supplier) würde Datensätze mit einem Lieferanten einschließlich wiederholter Vorkommen zählen.

Frage 6 von 10

Eine Zahlungstabelle in PostgreSQL hat eine DATE-Spalte paid_on mit Datensätzen von 2024 bis einschließlich 2026. Welcher Gruppierungsausdruck hält jeden Kalendermonat getrennt?
  1. EXTRACT(MONTH FROM paid_on)
  2. EXTRACT(YEAR FROM paid_on)
  3. paid_on
  4. to_char(paid_on, 'YYYY-MM')
Antwort zeigenAntwort ausblenden
Antwort: D
Der Jahr-Monat-Ausdruck gibt jedem Kalendermonat einen eigenen Schlüssel und hält Juni in verschiedenen Jahren getrennt. Eine Monatsnummer allein würde diese Junimonate zusammenfassen, während eine Gruppierung nach dem vollständigen Datum einen Monat in Tagesgruppen aufteilen und die gefragte Detailebene verändern würde.

Frage 7 von 10

Ein gruppierter Bericht hat die Teamsummen Rot 180, Blau 260 und Grün 200. Welche Teams bleiben nach HAVING SUM(amount) > 200?
  1. Blau
  2. Blau und Grün
  3. Rot und Blau
  4. Grün
Antwort zeigenAntwort ausblenden
Antwort: A
Nur Blau hat eine Summe, die strikt über 200 liegt. Grün entspricht dem Schwellenwert und besteht daher die Größer-als-Prüfung nicht; >= 200 würde Grün bestehen lassen. HAVING wendet diesen Vergleich auf jede fertig berechnete Teamsumme an und behält oder entfernt somit jedes gesamte Teamergebnis.

Frage 8 von 10

Eine PostgreSQL-Abfrage wählt Kategorie und Gesamtkosten aus, gruppiert nur nach Kategorie und verwendet ORDER BY supplier. Kategorien haben mehrere Lieferanten. Wie kann sie die Kategorien mit den höchsten Kosten zuerst anzeigen, ohne ihre Granularität zu verändern?
  1. Ergänze supplier in GROUP BY.
  2. Verwende ORDER BY supplier DESC.
  3. Verwende ORDER BY SUM(cost) DESC.
  4. Ergänze supplier in der SELECT-Liste.
Antwort zeigenAntwort ausblenden
Antwort: C
Die Sortierung nach SUM(cost) verwendet eine festgelegte Kennzahl für jede Kategoriegruppe und behält eine Zeile pro Kategorie. Ein gewöhnlicher Lieferantenwert kann eine Gruppe mit mehreren Lieferanten nicht ordnen. Eine Ergänzung von supplier in GROUP BY würde die Syntax zulässig machen, aber Kategorien aufteilen und die gefragte Detailebene des Berichts verändern.

Frage 9 von 10

In SQLite ergeben ganzzahlige Mengen über sechs Zeilen zusammen 23. Was gibt SUM(quantity) / COUNT(*) * 1.0 zurück?
  1. 3.0
  2. 3.8333333333333335
  3. 4.0
  4. 23.0
Antwort zeigenAntwort ausblenden
Antwort: A
Die ganzzahlige Division erfolgt zuerst: Bei 23 geteilt durch sechs wird der Nachkommateil abgeschnitten, sodass drei entsteht. Die Multiplikation dieses Ergebnisses mit 1,0 ergibt 3,0 und kann den verlorenen Nachkommateil nicht zurückbringen. Um den Nachkommateil des Durchschnitts zu erhalten, führe den Dezimaloperanden vor der Division mit 1.0 * SUM(quantity) / COUNT(*) ein.

Frage 10 von 10

Eine SQLite-Tabelle enthält drei Gebühren von 0,26. Eine Abfrage wählt ROUND(SUM(fee), 1) aus, behält die Gesamtgruppe aber nur mit HAVING SUM(fee) >= 0.8. Welches Ergebnis gibt sie zurück?
  1. Eine Zeile mit 0,8.
  2. Eine Zeile mit 0,9.
  3. Eine Zeile mit NULL.
  4. Keine Zeile.
Antwort zeigenAntwort ausblenden
Antwort: D
Die Gebühren ergeben zusammen 0,78, was nach dem Runden als 0,8 angezeigt würde. HAVING vergleicht die ungerundete Summe mit 0,8, sodass die Gruppe die Bedingung nicht erfüllt und keine Zeile erscheint. Würde man den gerundeten Anzeigewert als geprüften Wert behandeln, würde eine Gruppe angenommen, deren tatsächliche Summe unter dem Schwellenwert liegt.
Set 2: Grundgesamtheit und Detailebene des Berichts wählen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine Tickettabelle hat die Prioritätswerte 0, NULL, 2, 2 und NULL. Was gibt COUNT(priority) zurück?
  1. 5
  2. 3
  3. 2
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Tabelle work_log hat die Spalten consultant, year und hours. Ein Bericht benötigt für 2025 eine Gesamtstundenzahl pro Berater und soll nur Summen über 120 behalten. Welche Abfrageform beantwortet die Frage?
  1. WHERE year = 2025 AND hours > 120 GROUP BY consultant
  2. GROUP BY consultant, hours HAVING SUM(hours) > 120
  3. WHERE hours > 120 GROUP BY consultant, year
  4. WHERE year = 2025 GROUP BY consultant HAVING SUM(hours) > 120
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Tabelle speichert Lieferdaten als ISO-Text: '2025-12-28', '2026-01-04' und '2025-02-19'. Was geben MIN(delivery_date) und MAX(delivery_date) in dieser Reihenfolge zurück?
  1. 2025-02-19 und 2026-01-04
  2. 2025-12-28 und 2026-01-04
  3. 2026-01-04 und 2025-02-19
  4. 2026-01-04 und 2025-12-28
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine SQLite-Tabelle enthält die Paare (city, agent) (A, Jo), (A, Jo), (A, Kai), (NULL, Lee) und (NULL, Lee). Was gibt SELECT COUNT(*) FROM (SELECT DISTINCT city, agent FROM visits) AS pairs zurück?
  1. 2
  2. 4
  3. 3
  4. 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Vier Reparaturen haben die Werte (cost, credit) (50, 5), (80, NULL), (40, 0) und (30, NULL). NULL bedeutet, dass keine Gutschrift vorliegt. Wie lauten SUM(cost - credit) und die beabsichtigten gesamten Nettokosten in dieser Reihenfolge?
  1. 195 und 195
  2. 85 und 85
  3. 115 und 195
  4. 85 und 195
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Die Kundensummen sind Ali 90, Bea 120, Cam 120 und Dev 75. Welche Zeilen behält ORDER BY total DESC, customer ASC LIMIT 2, wenn die Namen alphabetisch sortiert werden?
  1. Ali 90 und Bea 120
  2. Bea 120 und Cam 120
  3. Cam 120 und Bea 120
  4. Bea 120 und Ali 90
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Gebührentabelle enthält drei Werte von 0,36. Was ergeben ROUND(SUM(fee), 1) und SUM(ROUND(fee, 1)) in dieser Reihenfolge, wenn du winzige Anzeigeabweichungen durch Gleitkommazahlen ignorierst?
  1. 1,2 und 1,1
  2. 1,1 und 1,1
  3. 1,1 und 1,2
  4. 1,2 und 1,2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Tabelle enthält die Paare (site, worker) (A, Ren), (A, Ren), (A, Sol), (B, Ren), (NULL, Sol) und (NULL, Sol). Wie viele Gruppen entstehen bei einer Gruppierung nach Standort und anschließend bei einer Gruppierung nach Standort und Mitarbeiter?
  1. 3 und 4
  2. 3 und 6
  3. 2 und 3
  4. 3 und 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Teilnehmerliste enthält die Schulungswerte Safety, Safety, Tools, Tools, Tools und First Aid. Was gibt SELECT training FROM roster GROUP BY training HAVING COUNT(*) >= 3 zurück?
  1. Safety und Tools
  2. Tools
  3. Tools und First Aid
  4. Keine Zeilen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Team A hat die Beträge 20, 80 und 100; Team B hat 60 und 90. Was bleibt nach WHERE amount >= 60 GROUP BY team HAVING AVG(amount) > 80?
  1. B mit Durchschnitt 75.
  2. A mit Durchschnitt etwa 66,67.
  3. A mit Durchschnitt 90.
  4. A mit 90 und B mit 75.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Fehlende Werte, Typen und Gruppen kombinieren10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was gibt SELECT 17 / 5 in SQLite zurück?
  1. 3.4
  2. 4
  3. 0
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Abfrage gruppiert Forderungen nach Team, wählt aber einen gewöhnlichen Mitarbeiternamen aus. Jedes Team hat mehrere Mitarbeiter. SQLite zeigt einen Namen an und PostgreSQL lehnt die Abfrage ab. Was erklärt den Unterschied?
  1. SQLite gruppiert automatisch nach Mitarbeiter; PostgreSQL benötigt eine ausdrückliche Gruppierung.
  2. SQLite erlaubt eine nicht aggregierte Spalte; der Name beschreibt nicht das ganze Team.
  3. SQLite gibt den alphabetisch ersten Mitarbeiter zurück; PostgreSQL benötigt eine ausdrückliche Sortierung.
  4. SQLite entfernt zusätzliche Mitarbeiter vor der Gruppierung; PostgreSQL behält jeden Mitarbeiter.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Standort L hat die Beträge 30, 50 und 80; Standort M hat 20 und 40. Du benötigst für jeden Standort den Prozentsatz der Bestellungen ab 60, einschließlich der Standorte ohne solche Bestellungen. Welche Prozentwerte sollten erscheinen?
  1. L 100,0 %; M fehlt.
  2. L 20,0 %; M 0,0 %.
  3. L 33,3 %; M 0,0 %.
  4. L 50,0 %; M 0,0 %.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Kundin Inez hat die Beträge 20, 30 und 50; Omar hat 200. Wie hoch sind der durchschnittliche Bestellbetrag und der durchschnittliche Gesamtbetrag pro Kunde in dieser Reihenfolge?
  1. 75 und 150
  2. 150 und 75
  3. 75 und 100
  4. 100 und 150
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Bestandstabelle hat die Zeilen (department, quantity, price) (A, 2, 7), (A, 3, 4) und (B, 5, 9). Was gibt SELECT SUM(quantity * price) FROM stock WHERE department = 'A' zurück?
  1. 55
  2. 71
  3. 26
  4. 14
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Regionsspalte enthält NULL, West, West, East und NULL. Was gibt COUNT(DISTINCT region) zurück?
  1. 2
  2. 3
  3. 5
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Keine Zeilen in jobs passen zu state = 'queued'. Was gibt SELECT team, COALESCE(SUM(hours), 0) FROM jobs WHERE state = 'queued' GROUP BY team zurück?
  1. Eine Zeile mit NULL als Team und einer Summe von 0.
  2. Eine Zeile mit NULL als Team und NULL als Summe.
  3. Eine Zeile mit Summe null pro Team.
  4. Keine Zeilen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Tabelle hat die Gebietswerte North, NULL, South, NULL und North. Wie lauten nach WHERE area IS NOT NULL GROUP BY area die Gruppenanzahlen?
  1. North 2; South 1; NULL 2.
  2. North 2; South 1.
  3. North 1; South 1.
  4. North 3; South 2.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Bericht benötigt durchschnittliche Rechnungsbeträge pro Büro, wobei nur Rechnungen aus 2025 eingehen und nur Büros mit mehr als fünf passenden Rechnungen angezeigt werden sollen. Wohin gehören die Datumsprüfung und die Prüfung der Anzahl?
  1. Beide Prüfungen in WHERE.
  2. Datum in HAVING; Anzahl in WHERE.
  3. Beide Prüfungen in HAVING.
  4. Datum in WHERE; Anzahl in HAVING.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Bestellungen haben die Werte (date, amount) (2025-01-10, 90), (2026-01-12, 140), (2026-01-20, 60) und (2026-02-03, 110). Gruppiere nach Jahr und Monat sowie nach CASE WHEN amount >= 100 THEN 'large' ELSE 'small' END. Wie viele Gruppen entstehen?
  1. 4
  2. 3
  3. 2
  4. 5
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Vollständige Berichte untersuchen und fertigstellen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Bericht gruppiert eine Buchungstabelle nach Raum. Welche HAVING-Bedingung behält Räume mit mindestens vier Buchungen?
  1. HAVING COUNT(*) >= 4
  2. HAVING COUNT(*) > 4
  3. HAVING COUNT(*) = 4
  4. HAVING COUNT(*) <= 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Filiale A hat die Beträge 10, 40 und 70; Filiale B hat 30 und 50. Vergleiche die Gruppierung nach WHERE amount >= 30 mit der Gruppierung aller Zeilen unter Verwendung von HAVING MIN(amount) >= 30. Welche Durchschnitte erscheinen?
  1. WHERE: A 40 und B 40; HAVING: nur B 40.
  2. WHERE: A 55 und B 40; HAVING: A 55 und B 40.
  3. WHERE: A 55 und B 40; HAVING: nur B 40.
  4. WHERE: nur B 40; HAVING: A 40 und B 40.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein nicht gruppierter Bericht kann keine Eingabezeilen haben. Welcher Ausdruck ergibt den Prozentsatz der Zeilen mit einem erfassten Wert, erhält Nachkommastellen und gibt bei einer leeren Grundgesamtheit sowohl in SQLite als auch in PostgreSQL NULL zurück?
  1. 100 * COUNT(value) / NULLIF(COUNT(*), 0)
  2. 100.0 * COUNT(value) / NULLIF(COUNT(*), 0)
  3. 100.0 * COUNT(value) / COALESCE(COUNT(*), 1)
  4. 100.0 * COUNT(*) / NULLIF(COUNT(value), 0)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

In PostgreSQL ist temperature vom Typ DOUBLE PRECISION. Wie rundest du den Durchschnitt auf zwei Nachkommastellen?
  1. ROUND(AVG(temperature), 2)
  2. CAST(ROUND(AVG(temperature)) AS NUMERIC)
  3. ROUND(CAST(AVG(temperature) AS INTEGER), 2)
  4. ROUND(CAST(AVG(temperature) AS NUMERIC), 2)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

In PostgreSQL steht COUNT(*) FILTER (WHERE paid = 1) neben COUNT(*) in einer gruppierten Abfrage ohne WHERE-Klausel. Was schränkt der Filter ein?
  1. Jedes Aggregat in der Gruppe.
  2. Nur die endgültige Ergebnisanzeige.
  3. Nur das Aggregat für bezahlte Einträge.
  4. Jede Zeile vor der Gruppenbildung.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Kunde U hat die Beträge 40 und 70, V hat 60, 60 und 10 und W hat 150. Wie viele Kunden haben mindestens zwei Bestellungen und eine Summe über 120?
  1. 2
  2. 3
  3. 5
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Abfrage behält vier Zeilen mit den Werten NULL, NULL, NULL und NULL. Was ergeben COUNT(*), COUNT(value) und MAX(value) in dieser Reihenfolge?
  1. 4, 0, NULL
  2. 0, 0, NULL
  3. 4, 4, NULL
  4. 4, 0, 0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Besuchstabelle enthält die Paare (customer, zone) (Jo, East), (Jo, East), (Kai, West), (Kai, North), (Lee, NULL) und (Lee, NULL). Wie verändert die Ergänzung von zone zur Gruppierung nach Kunde die Anzahl der Gruppen?
  1. Sie bleibt bei drei.
  2. Sie steigt von drei auf vier.
  3. Sie steigt von drei auf sechs.
  4. Sie steigt von drei auf fünf.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein gruppierter Bericht enthält die Zonen East, West und NULL. Ein Zeilenfilter lautet WHERE zone <> 'West'. Welche Zonengruppen können bleiben?
  1. East und NULL.
  2. East und West.
  3. Nur East.
  4. Nur NULL.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

In einer SQLite-Bestelltabelle hat Mai 2025 die Beträge 20 und 100, Mai 2026 hat 50 und 70 und Juni 2026 hat 200. Ein Bericht soll nur Monate aus 2026 mit mindestens zwei Bestellungen und gerundetem durchschnittlichem Betrag zeigen. Welches Ergebnis passt zur Anforderung?
  1. 2026-05: vier Bestellungen, Durchschnitt 60,00.
  2. 2026-05: zwei Bestellungen, Durchschnitt 60,00.
  3. 2026-06: eine Bestellung, Durchschnitt 200,00.
  4. 2026-05: zwei Bestellungen, Durchschnitt 120,00.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

58 Schlüsselbegriffe, jeweils mit Definition

A

abgeleitete Tabelle
Eine abgeleitete Tabelle ist das Ergebnis einer Abfrage, das in FROM verwendet wird, sodass eine zweite Abfrage die von der ersten erzeugten Zeilen zusammenfassen kann.
Eine innere Abfrage erzeugt Kundensummen; eine äußere Abfrage verwendet diese Summen als Eingabe, um ihren Durchschnitt zu berechnen.
Abgleich
Ein Abgleich prüft, ob Gruppenanzahlen und -summen zusammen den entsprechenden nicht gruppierten Kennzahlen über dieselbe gefilterte Grundgesamtheit entsprechen.
Führe die Abfrage zuerst ohne HAVING aus, damit ausgeschlossene Gruppen keinen Unterschied zwischen Bericht und Eingabesumme erklären.
abschließendes Runden
Abschließendes Runden verringert die Genauigkeit nach der vollständigen Aggregatberechnung und vermeidet so angesammelte Änderungen durch vorheriges Runden jeder Eingabe.
Drei Gebühren von 0,44 ergeben vor dem Runden 1,32 und gerundet 1,3; das vorherige Runden jeder Gebühr würde eine Summe von 1,2 ergeben.
Abschneiden
Beim Abschneiden werden Nachkommastellen ohne Runden entfernt; PostgreSQL bietet dafür TRUNC, und SQLite schneidet bei der Umwandlung in eine ganze Zahl ab.
TRUNC(2.97, 1) ergibt in PostgreSQL 2,9, während ROUND(2.97, 1) für diese exakte Dezimalzahl 3,0 ergibt.
Aggregatausdruck
Ein Aggregatausdruck wendet eine zusammenfassende Funktion auf eine Spalte oder eine Zeilenberechnung an, etwa um die Produkte aus Menge und Preis jeder Zeile zu addieren.
SUM(amount - discount) wertet die Subtraktion pro Zeile aus, bevor die Ergebnisse ohne NULL addiert werden.
Aggregatfunktion
Eine Aggregatfunktion fasst Werte aus mehreren Eingabezeilen zu einem Ergebnis zusammen, etwa einer Anzahl, Summe, einem Durchschnitt oder Extremwert.
Ein Umsatzbericht verwendet SUM(amount), um viele Bestellbeträge zu einer Summe für den ausgewählten Zeitraum zusammenzufassen.
AVG
AVG ist eine Aggregatfunktion, die das arithmetische Mittel ihrer Eingabewerte ohne NULL berechnet und dabei jeden erfassten Wert einmal verwendet.
AVG(amount) ergibt 97,5 für acht Bestellungen, deren Beträge zusammen 780 ergeben, und misst den durchschnittlichen Bestellbetrag.

B

bedingte Aggregation
Bei der bedingten Aggregation hängt der Beitrag jeder Zeile von einer Bedingung ab, sodass mehrere Kennzahlen für Teilmengen in einem Bericht möglich sind.
Ein regionaler Bericht kann alle Bestellungen und große Bestellungen zusammen anzeigen, ohne kleine Bestellungen vorher herauszufiltern.
bedingte Summe
Eine bedingte Summe addiert die Beträge passender Zeilen, gewöhnlich mit einem CASE-Ausdruck, der für nicht passende Zeilen null zurückgibt.
Für eine Summe großer Bestellungen gibt CASE den passenden Betrag selbst zurück; die Rückgabe von 1 würde stattdessen Bestellungen zählen.
bedingte Zählung
Eine bedingte Zählung zählt nur Zeilen, die eine gewählte Bedingung erfüllen, oft indem nicht passende Zeilen innerhalb von COUNT NULL zurückgeben.
COUNT(CASE WHEN amount >= 100 THEN 1 END) zählt große Bestellungen und überspringt die NULL-Ergebnisse nicht passender Zeilen.

C

CASE-Kategorie
Eine CASE-Kategorie ist eine durch Bedingungen in einem CASE-Ausdruck zugewiesene Bezeichnung, die zur Grundlage eines gruppierten Berichts werden kann.
Ein Schwellenwert von amount >= 100 ordnet eine Bestellung über genau 100 der Kategorie „large“ zu.
CAST
CAST wandelt einen Wert in einen gewünschten SQL-Typ um; die Auswirkungen hängen vom Zieltyp und der Datenbank-Engine ab.
Eine Umwandlung in REAL ermöglicht in SQLite eine Dezimaldivision, während eine Umwandlung in NUMERIC einen ganzzahligen Wert als ganze Zahl belassen kann.
COALESCE
COALESCE ist eine Funktion, die ihr erstes Argument zurückgibt, das nicht NULL ist. So lässt sich ein gewählter Ersatzwert für eine Eingabe oder ein Endergebnis festlegen.
COALESCE(SUM(amount), 0) zeigt null an, wenn eine leere Eingabemenge andernfalls eine NULL-Summe ergeben würde.
COUNT(*)
COUNT(*) ist die Aggregatform, die jede Eingabezeile zählt, einschließlich Zeilen mit fehlenden Werten in einer oder mehreren Spalten.
Eine Tabelle mit acht Bestellungen hat ein COUNT(*) von acht, selbst wenn für eine Bestellung keine Region erfasst ist.
COUNT(DISTINCT Spalte)
COUNT(DISTINCT Spalte) zählt die unterschiedlichen Werte einer Spalte ohne NULL; wiederholte erfasste Werte werden nur einmal gezählt.
Verwende COUNT(DISTINCT customer) für die Anzahl benannter Kunden, selbst wenn einige mehrere Bestellungen aufgeben.
COUNT(Spalte)
COUNT(Spalte) zählt Zeilen mit einem Wert in der genannten Spalte, der nicht NULL ist; wiederholte Werte und erfasste Nullen werden mitgezählt.
COUNT(discount) zählt eine Bestellung mit Rabatt null mit, lässt aber eine Bestellung mit Rabatt NULL aus.

D

Dezimaloperand
Ein Dezimaloperand ist eine numerische Eingabe, die vor der Division eingeführt dafür sorgt, dass ein Ergebnis mit Nachkommateil erhalten bleibt.
Die Multiplikation der Summe mit 1,0 vor der Division erhält den Nachkommateil eines aus Summen berechneten Durchschnitts.
DISTINCT
DISTINCT entfernt doppelte Werte oder Zeilen auf der Stufe, auf der es angewendet wird, etwa innerhalb eines Aggregats oder in der Ausgabeliste.
SUM(DISTINCT quantity) addiert jeden Mengenwert einmal, sodass wiederholte tatsächliche Verkäufe in der Summe fehlen können.
Duplikaterkennung
Die Duplikaterkennung findet wiederholte Werte, indem Datensätze nach diesen Werten gruppiert und Gruppen mit Anzahlen über eins beibehalten werden.
Eine Gruppierung nach Kunde mit HAVING COUNT(*) > 1 findet Kunden mit wiederholten Bestelldatensätzen.
Durchschnitt pro Kunde
Ein Durchschnitt pro Kunde lässt die Summe jedes Kunden einmal beitragen und unterscheidet sich damit vom Durchschnitt aller einzelnen Bestellbeträge.
Wenn fünf Kunden acht Bestellungen über zusammen 780 aufgeben, beträgt ihr Durchschnitt pro Kunde 156, obwohl der Durchschnitt der acht Bestellungen 97,5 beträgt.

E

eindeutige Wertekombination
Eine eindeutige Wertekombination ist eine einzigartige Kombination von Werten ausgewählter Spalten, die in einem Ergebnis unterschiedlicher Werte als eine Zeile behandelt wird.
East/Ana und East/Dara sind separate Paare, wenn ein Bericht unterschiedliche Kombinationen aus Region und Kunde auflistet.
Eingabe aus lauter NULL-Werten
Eine Eingabe aus lauter NULL-Werten hat Zeilen, aber keine erfassten Werte für den aggregierten Ausdruck, sodass COUNT(x) null ist.
Vier Bestellungen mit unbekannten Rabatten ergeben COUNT(*) vier und COUNT(discount) null, wenn ein Filter nur diese Bestellungen auswählt.

F

FILTER-Klausel für Aggregate
Eine FILTER-Klausel für Aggregate beschränkt die Eingabe eines Aggregats und lässt andere Aggregate derselben Abfrage andere Zeilen verwenden.
PostgreSQL kann eine gefilterte Zählung großer Bestellungen neben eine ungefilterte Zählung aller Bestellungen derselben Gruppe stellen.
funktionale Abhängigkeit
Eine funktionale Abhängigkeit bedeutet, dass ein Wert einen anderen bestimmt, etwa wenn der Primärschlüssel einer Bestellung deren Kunden bestimmt.
PostgreSQL kann den Kunden auswählen, wenn die Gruppierung den Primärschlüssel der Tabelle orders enthält.

G

ganzzahlige Division
Die ganzzahlige Division teilt ganzzahlige Operanden und schneidet in SQLite, PostgreSQL und SQL Server den Nachkommateil ab.
In SQLite ergibt die Division von 19 Artikeln durch acht Bestellungen mit ganzzahligen Operanden 2 statt des Mittelwerts 2,375.
Gleitkommazahl
Eine Gleitkommazahl speichert für viele Dezimalwerte einen binären Näherungswert, sodass manche Berechnungen kleine Rundungsabweichungen zeigen können.
Eine Addition mit DOUBLE PRECISION kann in PostgreSQL 0,30000000000000004 anzeigen, wo exakte Dezimalarithmetik 0,3 ergibt.
Granularität
Die Granularität eines Berichts beschreibt, wofür eine Ausgabezeile steht, etwa für einen Kunden oder Monat, und bestimmt die benötigte Gruppierung.
Ein Bericht mit einer Zeile pro Kunde benötigt Kennzahlen auf Kundenebene, selbst wenn die Quelltabelle Bestellungen erfasst.
GROUP BY
GROUP BY ist die Klausel, die Eingabezeilen nach übereinstimmenden Spalten- oder Ausdruckswerten zusammenfasst, sodass Aggregate einmal pro Gruppe berechnet werden können.
GROUP BY region ermöglicht es, in derselben Abfrage eine separate Bestellanzahl und Betragssumme für jede Region zu berechnen.
Gruppenbedingung
Eine Gruppenbedingung prüft eine Eigenschaft einer fertig berechneten Gruppe, etwa ob ihre Anzahl oder ihr Durchschnitt einen geforderten Schwellenwert erreicht.
Mindestens drei Bestellungen pro Monat sind eine Gruppenbedingung, weil dafür die fertig berechnete Monatsanzahl benötigt wird.
Gruppierung nach mehreren Spalten
Eine Gruppierung nach mehreren Spalten bildet für jede Kombination von Gruppierungswerten eine Gruppe, die tatsächlich in den verbleibenden Eingabezeilen vorkommt.
Die Gruppierung nach Region und Kunde ergibt separate East-Ergebnisse für Ana und Dara und hält zugleich Anas Bestellungen zusammen.
Gruppierungsausdruck
Ein Gruppierungsausdruck berechnet aus jeder Zeile einen Gruppierungswert, etwa einen Kalendermonat oder eine durch CASE zugewiesene Kategorie.
Ein Jahr-Monat-Ausdruck fasst Bestellungen aus einem Februar zusammen und hält sie von einem Februar in einem anderen Jahr getrennt.
Gruppierungsregel
Die Gruppierungsregel verlangt, dass jeder ausgewählte Wert durch Gruppierung oder Aggregation eine festgelegte Bedeutung für seine Gruppe hat.
Eine Region mit mehreren Kunden kann keinen einzelnen gewöhnlichen Kundennamen liefern, sofern die Abfrage nicht festlegt, wie er ausgewählt wird.
Gruppierungsspalte
Eine Gruppierungsspalte liefert die Werte, die bestimmen, welche Eingabezeilen in einer gruppierten zusammenfassenden Abfrage zusammengehören.
Wählt man den Kunden als Gruppierungsspalte, beschreibt ein Bericht Kunden statt einzelner Bestellungen.

H

HAVING
HAVING ist die Klausel, die Gruppen anhand ihrer Gruppierungswerte oder berechneten Aggregate filtert, nachdem diese Aggregate existieren.
HAVING SUM(amount) > 200 behält Regionen anhand ihrer Summe, ohne kleine Bestellungen aus verbleibenden Gruppen zu entfernen.

I

IS NULL
IS NULL ist eine SQL-Prüfung, die wahr ist, wenn ein Wert fehlt. Damit lassen sich fehlende Einträge ausdrücklich auswählen oder zählen.
WHERE region IS NULL wählt Bestellungen aus, deren Region nicht erfasst wurde, etwa eine Bestellung eines Kunden namens Eli.

J

Jahr-Monat-Schlüssel
Ein Jahr-Monat-Schlüssel identifiziert einen Kalendermonat zusammen mit seinem Jahr und verhindert, dass derselbe Monat verschiedener Jahre zusammengefasst wird.
Die Bezeichnungen „2025-01“ und „2026-01“ erzeugen separate Gruppen in einem Monatsbericht über beide Jahre.

K

Kennzahl
Eine Kennzahl ist die Größe, die ein Bericht auf der gewählten Detailebene berechnet, etwa eine Anzahl, Summe oder einen Durchschnitt.
Ein monatlicher Bestellbericht kann Bestellanzahl und durchschnittlichen Betrag als zwei Kennzahlen derselben monatlichen Grundgesamtheit verwenden.

L

leere Eingabemenge
Eine leere Eingabemenge liegt vor, wenn keine Zeilen in eine Berechnung eingehen, etwa weil eine WHERE-Bedingung keine passenden Datensätze findet.
Eine nicht gruppierte Zählung von Bestellungen aus South gibt null zurück, wenn jede Bestellung in der Tabelle zu einer anderen Region gehört.
logische Verarbeitungsreihenfolge
Die logische Verarbeitungsreihenfolge beschreibt die Stufen, die das Ergebnis einer Abfrage bestimmen, einschließlich der Zeilenfilterung vor Gruppenberechnungen.
Die Betrachtung von WHERE vor GROUP BY erklärt, warum das Entfernen kleiner Bestellungen den späteren Durchschnitt einer Region verändert.

M

MIN und MAX
MIN und MAX sind Aggregate, die nach den Vergleichsregeln der Datenbank den kleinsten und größten Eingabewert ohne NULL ermitteln.
MIN(order_date) findet das früheste Datum, wenn die Spalte Datumswerte oder einheitlich formatierten ISO-Datumstext enthält.

N

nachrangiges Sortierkriterium
Ein nachrangiges Sortierkriterium ist ein zusätzlicher Sortierschlüssel, der Zeilen eine wiederholbare Reihenfolge gibt, wenn ihre vorherigen Sortierwerte gleich sind.
ORDER BY total DESC, customer gibt gleichen Kundensummen eine stabile Reihenfolge, bevor eine Begrenzung angewendet wird.
nicht aggregierte Spalte
Eine nicht aggregierte Spalte ist eine in einer Aggregatabfrage ausgewählte Spalte, die weder Gruppierungsspalte ist noch innerhalb eines Aggregats steht.
SQLite kann einen Kunden neben einer Regionssumme anzeigen, selbst wenn mehrere Kunden zu dieser Region beigetragen haben.
NULL
NULL kennzeichnet einen fehlenden oder unbekannten SQL-Wert; Rechnen damit ergibt NULL, und NULL unterscheidet sich von null oder einer leeren Zeichenkette.
Ein unbekannter Rabatt kann bewirken, dass amount - discount NULL ist, sodass SUM den berechneten Wert dieser Zeile überspringt.
NULL-Gruppe
Eine NULL-Gruppe enthält die Zeilen, deren Gruppierungswert fehlt; SQL fasst diese Zeilen zu einer Ergebnisgruppe zusammen.
Mehrere Bestellungen ohne Region erhalten eine gemeinsame Summe, die mit einer Bezeichnung wie „Keine Region“ angezeigt werden kann.
NULLIF
NULLIF gibt NULL zurück, wenn seine beiden Argumente gleich sind, andernfalls das erste Argument. Das ist bei Divisoren von null nützlich.
NULLIF(COUNT(*), 0) macht den Nenner eines leeren Berichts zu NULL und vermeidet in PostgreSQL einen Fehler durch Division durch null.
NUMERIC und DECIMAL
NUMERIC und DECIMAL sind in PostgreSQL exakte Dezimaltypen; in SQLite verleihen diese Namen eine Affinität ohne exakte Dezimalspeicherung.
Für exakte Geldsummen in SQLite vermeiden ganzzahlige Centbeträge die Abhängigkeit von als binäre Näherungswerte gespeicherten Werten mit Nachkommateil.

O

ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY ist ein MySQL-Modus, der gruppierte Ausdrücke mit nicht gruppierten Werten ablehnt, die nicht durch die Gruppierung bestimmt sind.
MySQL lehnt es normalerweise ab, einen beliebigen Kunden auszuwählen, wenn die Abfrage Bestellungen nur nach Region gruppiert.
ORDER BY
ORDER BY ist die Klausel, die eine festgelegte Ausgabereihenfolge anfordert; damit lassen sich auch gruppierte Zeilen nach einem Aggregat oder dessen Alias sortieren.
ORDER BY total DESC listet nach der Berechnung jeder Gruppe die größten Gruppensummen zuerst auf.

P

Prozentanteil in der Gruppe
Ein Prozentanteil in der Gruppe misst eine Teilmenge als Anteil ihrer eigenen Gruppe und verwendet deren vollständige Grundgesamtheit als Nenner.
Eine große Bestellung unter drei Bestellungen aus East entspricht etwa 33,3 % der Bestellungen aus East, unabhängig von den Anzahlen anderer Regionen.

R

ROUND
ROUND ist eine Funktion, die einen numerischen Wert rundet; ihr zweites Argument gibt normalerweise die Stellen nach dem Komma an.
ROUND(AVG(amount), 2) rundet den fertig berechneten Durchschnitt auf zwei Stellen und lässt die vorherige Berechnung unverändert.
Rundungsdifferenz
Eine Rundungsdifferenz ist ein Unterschied, der durch das Verringern der Genauigkeit entsteht, etwa wenn gerundete Teile zusammen nicht mehr das gerundete Ganze ergeben.
Drei gleiche, auf eine Nachkommastelle angezeigte Prozentanteile ergeben zusammen 99,9 %, obwohl die exakten Anteile 100 % abdecken.
Rundungsgrenzfall
Ein Rundungsgrenzfall liegt genau zwischen zwei möglichen gerundeten Ergebnissen; das gewählte Ergebnis hängt vom Zahlentyp und der Rundungsregel ab.
PostgreSQL rundet exakte NUMERIC-Werte von 2,5 auf 3 und von -2,5 auf -3, beide Grenzfälle also von null weg.

S

SELECT-Alias
Ein SELECT-Alias ist ein einem Ausdruck zugewiesener Ausgabename, der in ORDER BY verwendet werden kann und dessen Verwendung an anderen Stellen vom Dialekt abhängt.
PostgreSQL akzeptiert ORDER BY total, benötigt aber in einem HAVING derselben Ebene den ausgeschriebenen Aggregatausdruck.
Sortierfolge
Eine Sortierfolge ist ein Regelwerk, mit dem die Datenbank Text vergleicht und ordnet. Dazu gehört, wie sich Groß- und Kleinschreibung auf Vergleiche auswirkt.
Das Minimum von Textwerten kann sich mit der Sortierfolge ändern, obwohl die Zeilen und die MIN-Abfrage gleich bleiben.
SUM
SUM ist eine Aggregatfunktion, die numerische Werte einer Spalte oder eines Ausdrucks über ihre Eingabezeilen hinweg addiert und dabei NULL-Werte auslässt.
SUM(quantity * unit_price) summiert Zeilenumsätze, nachdem jede Menge mit ihrem passenden Preis multipliziert wurde.

V

Vergleich mit dem ungerundeten Wert
Ein Vergleich mit dem ungerundeten Wert prüft den berechneten Wert vor dem Runden, selbst wenn die ausgewählte Ausgabe eine gerundete Version anzeigt.
Ein als 86,67 angezeigter Durchschnitt kann HAVING AVG(amount) >= 86.67 dennoch nicht erfüllen, wenn sein exakter Wert kleiner ist.

W

WHERE
WHERE ist die Klausel, die einzelne Eingabezeilen vor der Gruppierung filtert und damit bestimmt, welche Datensätze zu späteren Zusammenfassungen beitragen.
Ein Bericht, der auf Bestellungen aus 2026 beschränkt ist, verwendet eine Datumsbedingung in WHERE, bevor er Monatssummen berechnet.

Z

Zeilenbedingung
Eine Zeilenbedingung lässt sich für einen einzelnen Eingabedatensatz auswerten, etwa ob sein Datum in einem Bereich liegt oder sein Betrag einen Schwellenwert erreicht.
Die Prüfung amount >= 60 kann eine Bestellung aus East behalten und eine andere entfernen, bevor eine regionale Zusammenfassung existiert.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten