0%

Viele Zeilen zusammenfassen · Übung

Zeilen filtern, bevor sie zu Gruppen werden

Die Zusammenfassung für Elektronik kombiniert derzeit einen Projektor mit zweieinhalb Tagen und einen Lautsprecher mit zwanzigeinhalb Tagen. Angenommen, dieser Bericht soll nur Gegenstände mit einer üblichen Leihdauer von höchstens vierzehn Tagen betrachten. Der Lautsprecher muss entfernt werden, bevor die Summen seiner Kategorie berechnet werden.

Öffne summary.sql. Füge diese Zeile zwischen FROM items und GROUP BY category ein:

WHERE loan_days <= 14

Lass jede ausgewählte Spalte, jedes Aggregat, den Gruppenschlüssel und die Sortierklausel unverändert und klicke dann auf Run:

Columns: category | item_count | total_loan_days | shortest_loan_days | longest_loan_days | average_loan_days
electronics | 1 | 2.5 | 2.5 | 2.5 | 2.5
events | 2 | 21 | 7 | 14 | 10.5
tools | 2 | 10 | 3 | 7 | 5.0

Die Elektronikgruppe existiert weiterhin, hat jetzt aber nur eine beitragende Zeile. Ihre Anzahl, Summe, ihr Minimum, Maximum und Durchschnitt stammen alle allein vom Projektor. Der Lautsprecher über dem Limit gelangt nie in die Gruppe.

Verfolge diese beiden Quellzeilen durch die Entscheidung:

Gegenstandloan_days <= 14Gelangt in die Elektronikgruppe?
Projector, 2.5 Tagewahrja
Portable speaker, 20.5 Tagefalschnein

Wenn die Gruppierung beginnt, arbeitet SQLite für Elektronik nur noch mit der Projektorzeile.

WHERE arbeitet auf Quellzeilen. SQLite vergleicht zuerst für jeden Gegenstand loan_days mit 14 und behält die passenden Zeilen. Erst dann sammelt GROUP BY category diese verbliebenen Zeilen und berechnet die Aggregate innerhalb jeder Gruppe.

Der Grenzwert ist eingeschlossen. Die Projektionsleinwand hat genau vierzehn Tage, also behält <= 14 sie bei. < 14 würde die Veranstaltungszusammenfassung verändern, indem es eine laut Anforderungen erlaubte Zeile entfernt.

Diese Arbeitsreihenfolge beantwortet eine andere Frage, als vollständige Kategoriezusammenfassungen zu berechnen und anschließend einige Werte auszublenden. Hier fragt der Bericht: „Wie sieht jede Kategorie unter den Gegenständen mit höchstens vierzehn Tagen aus?“ Jede Zahl muss auf dieser kleineren Quellmenge beruhen.

Die Kategorie selbst wird nicht gefiltert. Elektronik bleibt in der Ausgabe, weil eine ihrer Zeilen passt. Eine Kategorie würde in diesem Schritt nur verschwinden, wenn keine ihrer Quellzeilen den WHERE-Vergleich besteht und damit nichts zum Gruppieren übrig bleibt.

Submit enthält einen Gegenstand über dem Limit, dessen Entfernung die Anzahl, Summe, das Maximum und den Durchschnitt seiner Gruppe verändert. Außerdem enthält es eine Zeile mit genau vierzehn Tagen als Grenzwert. Wenn sich nur eine Zahl ändert, prüfe, ob die WHERE-Klausel im SQL vor GROUP BY steht und nicht als Berechnung in einem einzelnen Ergebnisausdruck ergänzt wurde.

Du hast WHERE bereits verwendet, um einzelne Suchzeilen auszuwählen. Dieselbe Klausel behält hier diese Aufgabe. Neu ist, dass du siehst, wie ihre Entscheidung in jede spätere Gruppenzusammenfassung einfließt.

Aufgabe

Füge WHERE loan_days <= 14 zwischen FROM items und GROUP BY category in summary.sql hinzu. Behalte die vollständige Kategoriezusammenfassung unverändert bei.

Führe die Abfrage aus und prüfe, ob die Zeile über dem Limit zu keinem Elektronikwert beiträgt. Reiche sie dann ein.