Viele Zeilen zusammenfassen · Übung
Fertige Gruppen mit HAVING filtern
Nach dem Zeilenfilter für vierzehn Tage hat Elektronik nur noch einen beitragenden Gegenstand. Angenommen, der Bericht soll Kategorien nur zeigen, wenn mindestens zwei passende Gegenstände ihre Zusammenfassung tragen. Diese Regel lässt sich nicht anhand einer einzelnen Quellzeile entscheiden. Sie hängt von der fertigen Gruppenanzahl ab.
Öffne summary.sql. Füge diese Zeile zwischen GROUP BY category und ORDER BY category ASC hinzu:
HAVING COUNT(*) >= 2
Klicke auf Run. Die Elektronikgruppe verschwindet, während Veranstaltungsausrüstung und Werkzeuge bleiben:
Columns: category | item_count | total_loan_days | shortest_loan_days | longest_loan_days | average_loan_days
events | 2 | 21 | 7 | 14 | 10.5
tools | 2 | 10 | 3 | 7 | 5.0
Die Abfrage trifft jetzt zwei unterschiedliche Filterentscheidungen in zwei unterschiedlichen Schritten. WHERE loan_days <= 14 untersucht einzelne Gegenstände, bevor Gruppen entstehen. HAVING COUNT(*) >= 2 untersucht jede fertige Kategoriegruppe, nachdem SQLite weiß, wie viele passende Zeilen sie enthält.
Die sichtbaren Gruppen erreichen HAVING mit diesen Anzahlen:
| Fertige Gruppe | Anzahl passender Zeilen | Behalten? |
|---|---|---|
| electronics | 1 | nein |
| events | 2 | ja |
| tools | 2 | ja |
Der Gruppenfilter liest diese fertig berechneten Anzahlen. Er betrachtet die Leihdauern einzelner Gegenstände nicht erneut.
Diese Unterscheidung ist für Elektronik wichtig. Die Tabelle beginnt mit zwei Elektronikgegenständen, aber der Lautsprecher besteht die WHERE-Regel nicht. Die fertige Elektronikgruppe hat daher eine Anzahl von eins, und HAVING entfernt sie. Vor dem Zeilenfilter zu zählen würde eine andere Frage beantworten.
Der Grenzwert ist wieder eingeschlossen. Eine Gruppe mit genau zwei passenden Gegenständen soll bleiben, also lautet der Vergleich >= 2, nicht > 2.
Behalte die Regel zur maximalen Leihdauer in WHERE. Sie nach HAVING zu verschieben würde verhindern, dass sie einzelne Quellzeilen entfernt, bevor Summen und Durchschnitte berechnet werden. Behalte die Regel zur minimalen Gruppengröße in HAVING, weil eine Quellzeile die endgültige Anzahl ihrer Gruppe nicht mit sich trägt.
Dir fällt vielleicht COUNT(*) sowohl im ausgewählten Ergebnis als auch in der HAVING-Bedingung auf. Beide beziehen sich auf dieselbe fertige Gruppenanzahl. Eines zeigt sie den Lesenden; das andere verwendet sie, um zu entscheiden, ob diese Gruppe in die Antwort gehört.
Submit enthält eine Gruppe mit einer einzigen passenden Zeile, eine mit genau zwei und eine, die mit zwei Zeilen beginnt, aber nach dem Zeilenfilter auf eine schrumpft. Wenn die letzte Gruppe bleibt, prüfe, in welchem Schritt die von HAVING verwendete Anzahl entstanden ist.
Du kannst die Abfrage jetzt als Folge von Fragen lesen: Welche Gegenstände dürfen beitragen? Wie werden sie gruppiert? Welche fertigen Gruppen sind groß genug für den Bericht? Jede Klausel trifft eine klare Entscheidung.
Aufgabe
Füge HAVING COUNT(*) >= 2 zwischen GROUP BY category und ORDER BY category ASC in summary.sql hinzu.
Behalte die Quellzeilenregel in WHERE, führe die Abfrage aus und reiche die verbleibenden Gruppen ein.