GROUP BY und HAVING: Unterschied zwischen den Versionen

Aus FI-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Markierung: Manuelle Zurücksetzung
 
(58 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Einführung in GROUP BY in SQL ==
== Einführung in GROUP BY - SQL ==


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 ===


<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;  
</syntaxhighlight>
=== Beispiel ===
=== Beispiel ===


Gegeben sei eine Tabelle '''verkäufe''':
Tabelle '''verkauf''':


{| class="wikitable"
{| class="wikitable"
|-
|-
! verkäufer !! produkt !! betrag
! verkaeufer !! produkt !! betrag
|-
|-
| Anna || Apfel || 100
| Anna || Apfel || 100
Zeile 29: Zeile 32:
Wie viel Umsatz hat jeder Verkäufer gemacht?
Wie viel Umsatz hat jeder Verkäufer gemacht?


<syntaxhighlight lang="sql"> SELECT verkäufer, SUM(betrag) AS gesamtumsatz FROM verkäufe GROUP BY verkäufer; </syntaxhighlight>
<syntaxhighlight lang="sql">SELECT verkaeufer, SUM(betrag) AS gesamtumsatz  
'''Ergebnis:'''
FROM verkauf
GROUP BY verkaeufer; </syntaxhighlight>
 
==== Ergebnis: ====


{| class="wikitable"
{| class="wikitable"
 
|-
! verkäufer !! gesamtumsatz
! verkaeufer !! gesamtumsatz
Anna
|-
-
| Anna || 300
Ben
|-
}
| Ben || 500
|}


=== Hinweise ===
=== Hinweise ===
Zeile 44: Zeile 51:
Alle Spalten im SELECT, die keine Aggregatfunktion verwenden, müssen in der GROUP BY-Klausel stehen.
Alle Spalten im SELECT, die keine Aggregatfunktion verwenden, müssen in der GROUP BY-Klausel stehen.


Es ist möglich, nach mehreren Spalten zu gruppieren:
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 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
|}
 
== Einführung in HAVING - SQL ==
 
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 ===
 
<syntaxhighlight lang="sql">SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
GROUP BY spalte1
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>
 
=== Beispiel ===
 
Tabelle '''verkauf''':
 
{| class="wikitable"
|-
! verkaeufer !! produkt !! betrag
|-
| Anna || Apfel || 100
|-
| Anna || Birne || 150
|-
| Ben || Apfel || 200
|-
| Anna || Apfel || 50
|-
| Ben || Birne || 300
|}
 
 
==== Aufgabe: ====
Nur Produkte mit einem Umsatz über 150 € je Verkäufer anzeigen.
 
<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:'''
 
Anna, Apfel → 100 + 50 = 150 → nicht > 150, fällt raus
 
Anna, Birne → 150 → nicht > 150, fällt raus
 
Ben, Apfel → 200 → korrekt
 
Ben, Birne → 300 → korrekt
 
=== Erklärung ===
 
Die GROUP BY-Klausel gruppiert die Zeilen nach verkaeufer und produkt.
 
SUM(betrag) berechnet den Umsatz je Gruppe.
 
Die HAVING-Klausel filtert alle Gruppen heraus, deren Umsatz nicht über 150 liegt.
 
== Beispiel: WHERE + GROUP BY + HAVING ==
=== Syntax ===
 
<syntaxhighlight lang="sql">SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
WHERE bedingung
GROUP BY spalte1
HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>
 
=== Beispiel ===
 
Tabelle '''verkauf''':
 
{| class="wikitable"
|-
! verkaeufer !! produkt !! betrag
|-
| Anna || Apfel || 100
|-
| Anna || Birne || 150
|-
| Ben || Apfel || 200
|-
| Anna || Apfel || 50
|-
| Ben || Birne || 300
|}
 
==== Aufgabe: ====
Nur Umsätze mit Äpfeln und mehr als 150 € pro Verkäufer anzeigen.
 
<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"
|-
! 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.


<syntaxhighlight lang="sql"> SELECT verkäufer, produkt, SUM(betrag) FROM verkäufe GROUP BY verkäufer, produkt; </syntaxhighlight>
[[Kategorie:Datenbanken]]

Aktuelle Version vom 12. Mai 2025, 15:10 Uhr

Einführung in GROUP BY - SQL

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;

Beispiel

Tabelle verkauf:

verkaeufer produkt betrag
Anna Apfel 100
Anna Birne 150
Ben Apfel 200
Anna Apfel 50
Ben Birne 300


Aufgabe:

Wie viel Umsatz hat jeder Verkäufer gemacht?

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

Einführung in HAVING - SQL

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];

Beispiel

Tabelle verkauf:

verkaeufer produkt betrag
Anna Apfel 100
Anna Birne 150
Ben Apfel 200
Anna Apfel 50
Ben Birne 300


Aufgabe:

Nur Produkte mit einem Umsatz über 150 € je Verkäufer anzeigen.

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:

Anna, Apfel → 100 + 50 = 150 → nicht > 150, fällt raus

Anna, Birne → 150 → nicht > 150, fällt raus

Ben, Apfel → 200 → korrekt

Ben, Birne → 300 → korrekt

Erklärung

Die GROUP BY-Klausel gruppiert die Zeilen nach verkaeufer und produkt.

SUM(betrag) berechnet den Umsatz je Gruppe.

Die HAVING-Klausel filtert alle Gruppen heraus, deren Umsatz nicht über 150 liegt.

Beispiel: WHERE + GROUP BY + HAVING

Syntax

SELECT spalte1, AGGREGATFUNKTION(spalte2) 
FROM tabelle 
WHERE bedingung 
GROUP BY spalte1 
HAVING AGGREGATFUNKTION(spalte2) [Bedingung];

Beispiel

Tabelle verkauf:

verkaeufer produkt betrag
Anna Apfel 100
Anna Birne 150
Ben Apfel 200
Anna Apfel 50
Ben Birne 300

Aufgabe:

Nur Umsätze mit Äpfeln und mehr als 150 € pro Verkäufer anzeigen.

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.