GROUP BY und HAVING: Unterschied zwischen den Versionen

Aus FI-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 81: Zeile 81:
|}
|}


Sehr gerne! Hier ist eine **Einführung in `HAVING`** im selben **MediaWiki-Stil** wie zuvor bei `GROUP BY`, mit Erklärung, Syntax, Beispiel und Tabelle:
== Einführung in HAVING in 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.


\== Einführung in HAVING in SQL ==
=== Unterschied: WHERE vs. 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.
WHERE filtert vor der Gruppierung (auf Zeilenebene).


\=== Unterschied: WHERE vs. HAVING ===
HAVING filtert nach der Gruppierung (auf Gruppenebene).


* `WHERE` filtert **vor** der Gruppierung (auf Zeilenebene).
=== Syntax ===
* `HAVING` filtert **nach** der Gruppierung (auf Gruppenebene).


---
<syntaxhighlight lang="sql"> SELECT spalte1, AGGREGATFUNKTION(spalte2) FROM tabelle GROUP BY spalte1 HAVING AGGREGATFUNKTION(spalte2) [Bedingung]; </syntaxhighlight>
 
=== Beispiel: Tabelle ''verkäufe'' ===
\=== Syntax ===
 
<syntaxhighlight lang="sql">
SELECT spalte1, AGGREGATFUNKTION(spalte2)
FROM tabelle
GROUP BY spalte1
HAVING AGGREGATFUNKTION(spalte2) [Bedingung];
</syntaxhighlight>
 
---
 
\=== Beispiel: Tabelle ''verkäufe'' ===


{| class="wikitable"
{| class="wikitable"
\|-
|-
 
| ! verkäufer !! produkt !! betrag |  |      |  |    |
| -------------------------------- | - | ----- | - | --- |
| Anna                            |  | Apfel |  | 100 |
| -                                |  |      |  |    |
| Anna                            |  | Birne |  | 150 |
| -                                |  |      |  |    |
| Ben                              |  | Apfel |  | 200 |
| -                                |  |      |  |    |
| Anna                            |  | Apfel |  | 50  |
| -                                |  |      |  |    |
| Ben                              |  | Birne |  | 300 |
| }                                |  |      |  |    |
 
---
 
\=== Abfrage: Nur Produkte mit einem Umsatz über 150 € je Verkäufer anzeigen ===


<syntaxhighlight lang="sql">
! verkäufer !! produkt !! betrag
SELECT verkäufer, produkt, SUM(betrag) AS gesamtumsatz
Anna
FROM verkäufe
-
GROUP BY verkäufer, produkt
Anna
HAVING SUM(betrag) > 150;
-
</syntaxhighlight>
Ben
-
Anna
-
Ben
}


---
=== Abfrage: Nur Produkte mit einem Umsatz über 150 € je Verkäufer anzeigen ===


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


{| class="wikitable"
{| class="wikitable"
\|-
|-


| ! verkäufer !! produkt !! gesamtumsatz |  |      |  |    |
! verkäufer !! produkt !! gesamtumsatz
| -------------------------------------- | - | ----- | - | --- |
Anna
| Anna                                   |  | Apfel |  | 150 |
-
| -                                     |  |      |  |    |
Ben
| Ben                                   |  | Apfel |  | 200 |
-
| -                                     |  |      |  |    |
Ben
| Ben                                   |  | Birne |  | 300 |
}
| }                                     |  |      |  |    |


---
=== Erklärung ===


\=== Erklärung ===
Die GROUP BY-Klausel gruppiert die Zeilen nach verkäufer und produkt.


* Die `GROUP BY`-Klausel gruppiert die Zeilen nach `verkäufer` und `produkt`.
SUM(betrag) 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.


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


Möchtest du noch ein kombiniertes Beispiel mit `WHERE` + `GROUP BY` + `HAVING`?
Möchtest du noch ein kombiniertes Beispiel mit W

Version vom 5. Mai 2025, 11:49 Uhr

Einführung in GROUP BY in 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

Gegeben sei eine 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 verkäufer;

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. Sonst gibt es einen Fehler.

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 in 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 verkäufe

verkäufer produkt betrag

Anna - Anna - Ben - Anna - Ben }

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

 SELECT verkäufer, produkt, SUM(betrag) AS gesamtumsatz FROM verkäufe GROUP BY verkäufer, produkt HAVING SUM(betrag) > 150;

Ergebnis:

verkäufer produkt gesamtumsatz

Anna - Ben - Ben }

Erklärung

Die GROUP BY-Klausel gruppiert die Zeilen nach verkäufer und produkt.

SUM(betrag) berechnet den Umsatz je Gruppe.

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

Möchtest du noch ein kombiniertes Beispiel mit W