GROUP BY und HAVING: Unterschied zwischen den Versionen

Aus FI-Wiki
Keine Bearbeitungszusammenfassung
 
(48 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Einführung in GROUP BY - SQL ==
== 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.
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 ===
=== Syntax ===
Zeile 9: Zeile 8:
GROUP BY spalte1;  
GROUP BY spalte1;  
</syntaxhighlight>
</syntaxhighlight>
=== Beispiel ===


Gegeben sei eine Tabelle '''verkauf''':
=== Aufgabe ===
 
'''Wie viel Umsatz hat jeder Verkäufer gemacht?'''
 
Tabelle '''verkauf''':


{| class="wikitable"
{| class="wikitable"
Zeile 28: Zeile 30:
|}
|}


==== Lösung: ====
<syntaxhighlight lang="sql">SELECT verkaeufer, SUM(betrag) AS gesamtumsatz
FROM verkauf
GROUP BY verkaeufer; </syntaxhighlight>


==== Aufgabe: ====
Wie viel Umsatz hat jeder Verkäufer gemacht?
<syntaxhighlight lang="sql">SELECT verkaeufer , SUM(betrag) AS gesamtumsatz
FROM verkauf
GROUP BY verkäufer; </syntaxhighlight>
==== Ergebnis: ====
==== Ergebnis: ====


Zeile 46: Zeile 46:
|}
|}


=== Hinweise ===
==== Hinweise ====


Alle Spalten im SELECT, die keine Aggregatfunktion verwenden, müssen in der GROUP BY-Klausel stehen.
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. Sonst gibt es einen Fehler.
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: ====
===== Ungültige Abfrage: =====


<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag)  
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag)  
FROM verkauf  
FROM verkauf  
GROUP BY verkaeufer; </syntaxhighlight>
GROUP BY verkaeufer; </syntaxhighlight>
Diese Abfrage ist '''ungültig''', weil produkt nicht in der GROUP BY-Klausel steht und auch keine Aggregatfunktion verwendet wird.
Diese Abfrage ist '''ungültig''', weil produkt nicht in der GROUP BY-Klausel steht und auch keine [[Aggregatfunktionen|Aggregatfunktion]] verwendet wird.


==== Korrekte Version: ====
===== Korrekte Version: =====


<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag)  
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag)  
Zeile 80: Zeile 80:
|}
|}


== Einführung in HAVING - SQL ==
== 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.
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 ===
=== Unterschied: WHERE vs. HAVING ===


WHERE filtert vor der Gruppierung (auf Zeilenebene).
''' WHERE ''' filtert vor der Gruppierung (auf Zeilenebene).


HAVING filtert nach der Gruppierung (auf Gruppenebene).
''' HAVING ''' filtert nach der Gruppierung (auf Gruppenebene).


=== Syntax ===
=== Syntax ===
Zeile 97: Zeile 97:
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>


=== Beispiel ===
=== Aufgabe ===
 
'''Es sollen nur Produkte mit einem Umsatz über 150 € je Verkäufer angezeigt werden. '''


Gegeben sei eine Tabelle '''verkauf''':
Tabelle '''verkauf''':


{| class="wikitable"
{| class="wikitable"
Zeile 116: Zeile 118:
|}
|}


==== Aufgabe: Nur Produkte mit einem Umsatz über 150 € je Verkäufer anzeigen ====
=== Lösung: ===


<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz  
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz  
Zeile 123: Zeile 125:
HAVING SUM(betrag) > 150; </syntaxhighlight>
HAVING SUM(betrag) > 150; </syntaxhighlight>


==== Ergebnis: ====
=== Ergebnis: ===


{| class="wikitable"
{| class="wikitable"
Zeile 134: Zeile 136:
|}
|}


''' Gruppierte Summen:'''
=== Gruppierte Summen: ===


Anna, Apfel 100 + 50 = 150 nicht > 150, fällt raus
{| 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
|}


Anna, Birne → 150 → nicht > 150, fällt raus
=== Erklärung ===
 
Ben, Apfel → 200 → korrekt


Ben, Birne → 300 → korrekt
<syntaxhighlight lang="sql">GROUP BY verkaeufer, produkt</syntaxhighlight>
gruppiert nach Verkäufer und Produkt.


=== Erklärung ===


Die GROUP BY-Klausel gruppiert die Zeilen nach verkaeufer und produkt.
<syntaxhighlight lang="sql">SUM(betrag)</syntaxhighlight>
berechnet den Umsatz je Gruppe.


SUM(betrag) berechnet den Umsatz je Gruppe.


Die HAVING-Klausel filtert alle Gruppen heraus, deren Umsatz nicht über 150 liegt.
<syntaxhighlight lang="sql">HAVING SUM(betrag) > 150</syntaxhighlight>
filtert alle Gruppen heraus, deren Umsatz nicht über 150 liegt.


== Beispiel: WHERE + GROUP BY + HAVING ==
== WHERE + GROUP BY + HAVING ==
=== Syntax ===
=== Syntax ===


Zeile 161: Zeile 172:
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>


=== Beispiel ===
=== Aufgabe: ===
 
'''Nur Umsätze mit Äpfeln und mehr als 150 € pro Verkäufer anzeigen.'''
Gegeben sei eine Tabelle '''verkauf''':


Tabelle '''verkauf''':


{| class="wikitable"
{| class="wikitable"
Zeile 181: Zeile 192:
|}
|}


=== Aufgabe: Nur Umsätze mit ''Apfel'' gruppieren und Gruppen mit mehr als 150 € anzeigen ===
=== Lösung: ===


<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz  
<syntaxhighlight lang="sql">SELECT verkaeufer, produkt, SUM(betrag) AS gesamtumsatz  
Zeile 188: Zeile 199:
GROUP BY verkaeufer, produkt  
GROUP BY verkaeufer, produkt  
HAVING SUM(betrag) > 150; </syntaxhighlight>
HAVING SUM(betrag) > 150; </syntaxhighlight>
=== 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.


=== Ergebnis: ===
=== Ergebnis: ===
Zeile 205: Zeile 208:
| Ben || Apfel || 200
| Ben || Apfel || 200
|}
|}
Nur Ben hat mit Apfel einen Umsatz über 150 € erreicht.
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.