GROUP BY und HAVING: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
| (87 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
== | == GROUP BY == | ||
Die GROUP BY-Klausel wird in [[SQL]] verwendet, um Zeilen mit denselben Werten in einer oder mehreren Spalten zu gruppieren. Sie wird in der Regel mit [[Aggregatfunktionen]] wie COUNT(), SUM(), AVG(), MAX() oder MIN() kombiniert. | |||
=== Syntax === | |||
<syntaxhighlight lang="sql">SELECT spalte1, AGGREGATFUNKTION(spalte2) | |||
FROM tabelle | |||
GROUP BY spalte1; | |||
</syntaxhighlight> | |||
=== Aufgabe === | |||
'''Wie viel Umsatz hat jeder Verkäufer gemacht?''' | |||
Tabelle '''verkauf''': | |||
{| class="wikitable" | |||
|- | |||
! verkaeufer !! produkt !! betrag | |||
|- | |||
| Anna || Apfel || 100 | |||
|- | |||
| Anna || Birne || 150 | |||
|- | |||
| Ben || Apfel || 200 | |||
|- | |||
| Anna || Apfel || 50 | |||
|- | |||
| Ben || Birne || 300 | |||
|} | |||
==== Lösung: ==== | |||
<syntaxhighlight lang="sql">SELECT verkaeufer, SUM(betrag) AS gesamtumsatz | |||
FROM verkauf | |||
GROUP BY verkaeufer; </syntaxhighlight> | |||
==== Ergebnis: ==== | |||
{| class="wikitable" | |||
|- | |||
! verkaeufer !! gesamtumsatz | |||
|- | |||
| Anna || 300 | |||
|- | |||
| Ben || 500 | |||
|} | |||
==== Hinweise ==== | |||
Alle Spalten im SELECT, die keine [[Aggregatfunktionen|Aggregatfunktion]] verwenden, müssen in der GROUP BY-Klausel stehen. | |||
Wenn du GROUP BY verwendest, musst du jede Spalte, die du im SELECT-Teil ohne Aggregatfunktion angibst, auch in der GROUP BY-Klausel aufführen. | |||
===== Ungültige Abfrage: ===== | |||
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) | |||
FROM verkauf | |||
GROUP BY verkaeufer; </syntaxhighlight> | |||
Diese Abfrage ist '''ungültig''', weil produkt nicht in der GROUP BY-Klausel steht und auch keine [[Aggregatfunktionen|Aggregatfunktion]] verwendet wird. | |||
===== Korrekte Version: ===== | |||
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) | |||
FROM verkauf | |||
GROUP BY verkaeufer, produkt; </syntaxhighlight> | |||
Hier stehen sowohl verkäufer als auch produkt im GROUP BY, also ist die Abfrage korrekt. | |||
Ergebnis: | |||
{| class="wikitable" | |||
|- | |||
! verkaeufer !! produkt !! gesamtumsatz | |||
|- | |||
| Anna || Apfel || 150 | |||
|- | |||
| Anna || Birne || 150 | |||
|- | |||
| Ben || Apfel || 200 | |||
|- | |||
| Ben || Birne || 300 | |||
|} | |||
== HAVING == | |||
Die HAVING-Klausel wird in [[SQL]] verwendet, um Gruppenergebnisse nach der Aggregation zu filtern. Sie funktioniert ähnlich wie WHERE, aber im Unterschied zu WHERE kann HAVING [[Aggregatfunktionen]] wie SUM(), AVG(), COUNT() usw. verwenden. | |||
=== Unterschied: WHERE vs. HAVING === | |||
''' WHERE ''' filtert vor der Gruppierung (auf Zeilenebene). | |||
''' HAVING ''' filtert nach der Gruppierung (auf Gruppenebene). | |||
=== Syntax === | === Syntax === | ||
<syntaxhighlight lang="sql"> SELECT spalte1, AGGREGATFUNKTION(spalte2) FROM tabelle GROUP BY spalte1; </syntaxhighlight> | <syntaxhighlight lang="sql">SELECT spalte1, AGGREGATFUNKTION(spalte2) | ||
FROM tabelle | |||
GROUP BY spalte1 | |||
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight> | |||
=== Aufgabe === | |||
'''Es sollen nur Produkte mit einem Umsatz über 150 € je Verkäufer angezeigt werden. ''' | |||
Tabelle '''verkauf''': | |||
{| class="wikitable" | |||
|- | |||
! verkaeufer !! produkt !! betrag | |||
|- | |||
| Anna || Apfel || 100 | |||
|- | |||
| Anna || Birne || 150 | |||
|- | |||
| Ben || Apfel || 200 | |||
|- | |||
| Anna || Apfel || 50 | |||
|- | |||
| Ben || Birne || 300 | |||
|} | |||
=== Lösung: === | |||
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz | |||
FROM verkauf | |||
GROUP BY verkaeufer, produkt | |||
HAVING SUM(betrag) > 150; </syntaxhighlight> | |||
=== Ergebnis: === | |||
{| class="wikitable" | |||
|- | |||
! verkaeufer !! produkt !! gesamtumsatz | |||
|- | |||
| Ben || Apfel || 200 | |||
|- | |||
| Ben || Birne || 300 | |||
|} | |||
=== Gruppierte Summen: === | |||
{| class="wikitable" style="width:60%; text-align:center;" | |||
! verkaeufer!! produkt !! gesamtumsatz kumuliert !! Ergebnis | |||
|- | |||
| Anna || Apfel || 100 + 50 = 150 || fällt raus (nicht > 150) | |||
|- | |||
| Anna || Birne || 150 || fällt raus (nicht > 150) | |||
|- | |||
| Ben || Apfel || 200 || korrekt | |||
|- | |||
| Ben || Birne || 300 || korrekt | |||
|} | |||
=== Erklärung === | |||
<syntaxhighlight lang="sql">GROUP BY verkaeufer, produkt</syntaxhighlight> | |||
gruppiert nach Verkäufer und Produkt. | |||
<syntaxhighlight lang="sql">SUM(betrag)</syntaxhighlight> | |||
berechnet den Umsatz je Gruppe. | |||
<syntaxhighlight lang="sql">HAVING SUM(betrag) > 150</syntaxhighlight> | |||
filtert alle Gruppen heraus, deren Umsatz nicht über 150 liegt. | |||
== WHERE + GROUP BY + HAVING == | |||
=== Syntax === | |||
<syntaxhighlight lang="sql">SELECT spalte1, AGGREGATFUNKTION(spalte2) | |||
FROM tabelle | |||
WHERE bedingung | |||
GROUP BY spalte1 | |||
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight> | |||
=== Aufgabe: === | |||
'''Nur Umsätze mit Äpfeln und mehr als 150 € pro Verkäufer anzeigen.''' | |||
Tabelle '''verkauf''': | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! verkaeufer !! produkt !! betrag | ||
|- | |- | ||
| Anna || Apfel || 100 | | Anna || Apfel || 100 | ||
| Zeile 25: | Zeile 192: | ||
|} | |} | ||
=== Lösung: === | |||
== | <syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz | ||
FROM verkauf | |||
WHERE produkt = 'Apfel' | |||
GROUP BY verkaeufer, produkt | |||
HAVING SUM(betrag) > 150; </syntaxhighlight> | |||
=== Ergebnis: === | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |||
! verkaeufer !! produkt !! gesamtumsatz | |||
|- | |||
| Ben || Apfel || 200 | |||
|} | |||
Nur Ben hat mit Äpfeln einen Umsatz über 150 € erreicht. | |||
=== Erklärung === | |||
<syntaxhighlight lang="sql">WHERE produkt = 'Apfel'</syntaxhighlight> filtert alle Zeilen vorab auf Apfel-Verkäufe. | |||
= | <syntaxhighlight lang="sql">GROUP BY verkaeufer, produkt</syntaxhighlight> gruppiert nach Verkäufer und Produkt. | ||
<syntaxhighlight lang="sql">HAVING SUM(betrag) > 150</syntaxhighlight> filtert die Gruppen, deren Umsatz über 150 € liegt. | |||
[[Kategorie:Datenbanken]] | |||
Aktuelle Version vom 11. Januar 2026, 10:59 Uhr
GROUP BY
Die GROUP BY-Klausel wird in SQL verwendet, um Zeilen mit denselben Werten in einer oder mehreren Spalten zu gruppieren. Sie wird in der Regel mit Aggregatfunktionen wie COUNT(), SUM(), AVG(), MAX() oder MIN() kombiniert.
Syntax
SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
GROUP BY spalte1;
Aufgabe
Wie viel Umsatz hat jeder Verkäufer gemacht?
Tabelle verkauf:
| verkaeufer | produkt | betrag |
|---|---|---|
| Anna | Apfel | 100 |
| Anna | Birne | 150 |
| Ben | Apfel | 200 |
| Anna | Apfel | 50 |
| Ben | Birne | 300 |
Lösung:
SELECT verkaeufer, SUM(betrag) AS gesamtumsatz
FROM verkauf
GROUP BY verkaeufer;
Ergebnis:
| verkaeufer | gesamtumsatz |
|---|---|
| Anna | 300 |
| Ben | 500 |
Hinweise
Alle Spalten im SELECT, die keine Aggregatfunktion verwenden, müssen in der GROUP BY-Klausel stehen.
Wenn du GROUP BY verwendest, musst du jede Spalte, die du im SELECT-Teil ohne Aggregatfunktion angibst, auch in der GROUP BY-Klausel aufführen.
Ungültige Abfrage:
SELECT verkaeufer, produkt, SUM(betrag)
FROM verkauf
GROUP BY verkaeufer;
Diese Abfrage ist ungültig, weil produkt nicht in der GROUP BY-Klausel steht und auch keine Aggregatfunktion verwendet wird.
Korrekte Version:
SELECT verkaeufer, produkt, SUM(betrag)
FROM verkauf
GROUP BY verkaeufer, produkt;
Hier stehen sowohl verkäufer als auch produkt im GROUP BY, also ist die Abfrage korrekt.
Ergebnis:
| verkaeufer | produkt | gesamtumsatz |
|---|---|---|
| Anna | Apfel | 150 |
| Anna | Birne | 150 |
| Ben | Apfel | 200 |
| Ben | Birne | 300 |
HAVING
Die HAVING-Klausel wird in SQL verwendet, um Gruppenergebnisse nach der Aggregation zu filtern. Sie funktioniert ähnlich wie WHERE, aber im Unterschied zu WHERE kann HAVING Aggregatfunktionen wie SUM(), AVG(), COUNT() usw. verwenden.
Unterschied: WHERE vs. HAVING
WHERE filtert vor der Gruppierung (auf Zeilenebene).
HAVING filtert nach der Gruppierung (auf Gruppenebene).
Syntax
SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
GROUP BY spalte1
HAVING AGGREGATFUNKTION(spalte2) [Bedingung];
Aufgabe
Es sollen nur Produkte mit einem Umsatz über 150 € je Verkäufer angezeigt werden.
Tabelle verkauf:
| verkaeufer | produkt | betrag |
|---|---|---|
| Anna | Apfel | 100 |
| Anna | Birne | 150 |
| Ben | Apfel | 200 |
| Anna | Apfel | 50 |
| Ben | Birne | 300 |
Lösung:
SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz
FROM verkauf
GROUP BY verkaeufer, produkt
HAVING SUM(betrag) > 150;
Ergebnis:
| verkaeufer | produkt | gesamtumsatz |
|---|---|---|
| Ben | Apfel | 200 |
| Ben | Birne | 300 |
Gruppierte Summen:
| verkaeufer | produkt | gesamtumsatz kumuliert | Ergebnis |
|---|---|---|---|
| Anna | Apfel | 100 + 50 = 150 | fällt raus (nicht > 150) |
| Anna | Birne | 150 | fällt raus (nicht > 150) |
| Ben | Apfel | 200 | korrekt |
| Ben | Birne | 300 | korrekt |
Erklärung
GROUP BY verkaeufer, produkt
gruppiert nach Verkäufer und Produkt.
SUM(betrag)
berechnet den Umsatz je Gruppe.
HAVING SUM(betrag) > 150
filtert alle Gruppen heraus, deren Umsatz nicht über 150 liegt.
WHERE + GROUP BY + HAVING
Syntax
SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
WHERE bedingung
GROUP BY spalte1
HAVING AGGREGATFUNKTION(spalte2) [Bedingung];
Aufgabe:
Nur Umsätze mit Äpfeln und mehr als 150 € pro Verkäufer anzeigen.
Tabelle verkauf:
| verkaeufer | produkt | betrag |
|---|---|---|
| Anna | Apfel | 100 |
| Anna | Birne | 150 |
| Ben | Apfel | 200 |
| Anna | Apfel | 50 |
| Ben | Birne | 300 |
Lösung:
SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz
FROM verkauf
WHERE produkt = 'Apfel'
GROUP BY verkaeufer, produkt
HAVING SUM(betrag) > 150;
Ergebnis:
| verkaeufer | produkt | gesamtumsatz |
|---|---|---|
| Ben | Apfel | 200 |
Nur Ben hat mit Äpfeln einen Umsatz über 150 € erreicht.
Erklärung
WHERE produkt = 'Apfel'
filtert alle Zeilen vorab auf Apfel-Verkäufe.
GROUP BY verkaeufer, produkt
gruppiert nach Verkäufer und Produkt.
HAVING SUM(betrag) > 150
filtert die Gruppen, deren Umsatz über 150 € liegt.
