Daten verdichten
COUNT, GROUP BY und HAVING in SPARQL
Aggregate fassen Lösungen zusammen; GROUP BY definiert Gruppen und HAVING filtert aggregierte Ergebnisse.
Gruppen vor dem Aggregat festlegen
GROUP BY fasst Lösungszeilen mit demselben Schlüssel zusammen. COUNT und AVG werden innerhalb jeder Gruppe ausgewertet. Eine zusätzlich ausgegebene Variable muss gruppiert oder passend aggregiert sein.
Legen Sie zuerst fest, was eine Zeile fachlich bedeutet: Produkt, Angebot oder Kombination aus Produkt und Kategorie. Erst danach lässt sich entscheiden, welches Zählen sinnvoll ist.
COUNT, COUNT DISTINCT und AVG getrennt prüfen
COUNT(*) zählt Lösungszeilen. COUNT(?produkt) zählt die Zeilen, in denen ?produkt gebunden ist. COUNT(DISTINCT ?produkt) zählt verschiedene gebundene Produktwerte. Ein DISTINCT innerhalb von COUNT verändert nicht gleichzeitig AVG(?preis).
Im Beispiel erscheint der Bohrer zweimal mit Preis 10. COUNT(*) liefert deshalb 3 für Werkzeug, COUNT(DISTINCT ?produkt) dagegen 2. AVG rechnet weiterhin (10 + 10 + 20) / 3, also ungefähr 13,33. Der Mittelwert zweier einmal gezählter Produkte wäre hier 15. Das sind unterschiedliche Kennzahlen.
AVG(DISTINCT ?preis) wäre keine allgemeine Reparatur: Zwei verschiedene Produkte dürfen denselben Preis haben. Für einen Produktmittelwert muss zuerst genau ein fachlich definierter Preis je Produkt ermittelt werden, etwa anhand eines Stichtags oder einer ausdrücklich gewählten Angebotsregel.
FILTER und HAVING an der richtigen Stelle einsetzen
Ein FILTER im WHERE-Block schränkt die Lösungen vor der Gruppierung ein. HAVING prüft Bedingungen auf Gruppen. Die Abfrage behält nur Kategorien mit mindestens zwei unterschiedlichen Produkten.
Garten verschwindet deshalb aus dem Resultat. Entfernen Sie allein die HAVING-Zeile, erscheint zusätzlich Garten mit einer Zeile, einem Produkt und Mittelwert 30. So lässt sich die Wirkung dieser Bedingung isoliert prüfen.
Fehlende Bindungen und leere Gruppen
Wenn Produkte über OPTIONAL eingebunden werden, kann eine Kategorie eine Lösungszeile ohne Produktbindung behalten. COUNT(*) kann dann 1 sein, obwohl COUNT(?produkt) 0 ergibt. Wählen Sie die Zählung nach der fachlichen Frage.
Ohne passende Ausgangszeile erzeugt GROUP BY nicht von selbst eine Kategorie mit Nullprodukten. Für solche Berichte muss die Kategorienliste Teil des Musters sein. Prüfen Sie außerdem numerische Datentypen vor einem Preisaggregat; ein lesbarer Text ist noch kein numerischer Wert.
Vollständiges Beispiel mit VALUES und Sollresultat
Diese selbst erstellten vier Zeilen sind vollständig in der Abfrage enthalten. Sie benötigen keinen Produktkatalog und zeigen bewusst ein doppelt vorkommendes Produkt.
PREFIX ex: <https://example.org/>
SELECT ?kategorie
(COUNT(*) AS ?zeilen)
(COUNT(DISTINCT ?produkt) AS ?produkte)
(AVG(?preis) AS ?mittelwert)
WHERE {
VALUES (?kategorie ?produkt ?preis) {
("Werkzeug" ex:bohrer 10)
("Werkzeug" ex:bohrer 10)
("Werkzeug" ex:saege 20)
("Garten" ex:schere 30)
}
}
GROUP BY ?kategorie
HAVING (COUNT(DISTINCT ?produkt) >= 2)
ORDER BY ?kategorie| kategorie | zeilen | produkte | mittelwert |
|---|---|---|---|
| Werkzeug | 3 | 2 | 13,333… |
Das Dezimalformat kann je nach Endpunkt variieren. Entscheidend sind eine Ergebniszeile, drei Lösungszeilen innerhalb der Gruppe und zwei unterschiedliche Produkte. Die Wiederholung von ex:bohrer bleibt für AVG erhalten.
Ändern Sie für einen zweiten Versuch nur die letzte Preiszahl von 30 auf 40. Das Ergebnis bleibt gleich, weil die Kategorie Garten weiterhin an HAVING scheitert. Entfernen Sie anschließend HAVING, um die zweite Gruppe zu sehen.
Den Aufbau von Eingabemengen erklärt FILTER, BIND und VALUES. Bei unerwarteten Mehrfachzeilen hilft die SPARQL-Debug-Checkliste, einzelne Muster schrittweise zu prüfen.
Eigenständige Beispielabfrage für diese Intention. Endpunktfunktionen und Datensatz müssen vor Produktion separat geprüft werden.
Prüffrage für die Praxis
Prüfe vor dem Zählen, ob Joins Duplikate erzeugen.
Quellen zu diesem Beitrag
Auswahl auf Artikelebene, geprüft am 29.09.2026.
- W3C SPARQL 1.1 Query Language: Aggregates
Normative Definitionen zu Aggregaten und Gruppierung. - W3C SPARQL 1.1: Aggregate Projection Restrictions und HAVING
Gruppenbedingungen und Regeln für projizierte Werte.