Gruppierung
Sucharten mit Ausgabespalten (CSV Suche, Tupel-Suche) unterstützen optional die Definition einer Liste von Projektionen für Gruppierungskriterien.
Konfigurierte Gruppierungskriterien werden in der Regel direkt auf den GROUP BY-Abschnitt in erzeugten SELECT-Anweisungen abgebildet.
Die Gruppierung zielt darauf ab, die primäre Trefferliste einer Suche nachträglich so zusammenzufassen, dass im Endergebnis für jede eindeutige Kombination der als Gruppierungskriterien aufgelisteten Projektionen nur eine einzige Zeile ausgegeben wird. Dabei können Aggregationsfunktionen (s. Aggregation) verwendet werden, um die Daten der gruppierten Datensätze zusammenzufassen.
Die primäre Trefferliste berücksichtigt die ggf. als "Bedingung" definierten Einschränkungen sowie ggf. Joins, die auf die primäre Trefferliste sowohl einschränkend als auch multiplizierend wirken können.
Als Gruppierungskriterium definierte Projektionen müssen nicht als Ausgabespalten konfiguriert sein.
Umgekehrt gilt aber für die Definition von Projektionen für Ausgabespalten oder zur Sortierung die folgende strikte Regel:
Eine Projektion für eine Ausgabespalte oder ein Sortierkriterium muss als "Projektion" innerhalb einer Aggregationsfunktion (s. Aggregation) eingesetzt werden, wenn deren Konfiguration ein Feld einbezieht, das nicht auch per Feldprojektion als Gruppierungskriterium definiert ist.
►ANMERKUNG◄ Was diese Restriktion für die praktische Handhabung der Gruppierung bedeutet, sollen das letzte Beispiel (s. unten) illustrieren.
►WICHTIG◄ Die Option "Gesamtanzahl berechnen" darf nicht ausgewählt sein, wenn unter Gruppierung mehr als ein Gruppierungskriterium konfiguriert ist.
Konfiguration
Das Datenmodell der relevanten Sucharten (CSV Suche, Tupel-Suche) bietet ein Listenfeld Gruppierung (groupBy) an, das als Listenwerte Projektionen erwartet:
Per Standard (s. Screenshot oben) ist die Liste Gruppierung leer.
Per Klick auf das
-Symbol kann der Liste ein Gruppierungskriterium (Projektionskonfiguration) hinzugefügt werden
Ein bestehendes Gruppierungskriterium kann per Klick auf das Mülltonne-Symbol entfernt werden.
Soweit der Kontext eine Baumstruktur für die Darstellung der Suche bereitstellt, kann die Reihenfolgeposition von Gruppierungskriterien per Drag & Drop angepasst werden.
ACHTUNG
Die Reihenfolge der Gruppierungskriterien hat im Allgemeinen keinen Einfluss auf die Ergebnisse der Gruppierung und von ggf. vorhandenen Aggregationsfunktionen. Allerdings kann die Reihenfolge der Gruppierungsergebnisse von der Reihenfolge der Gruppierungskriterien abhängen und das kann in Verbindung mit einer Begrenzung der Ausgabezeilen über den Parameter "Maximale Ergebnisse" zu inhaltlichen Unterschieden im Ergebnis führen. Dies betrifft auch den Fall, dass für den Parameter "Maximale Ergebnisse" der Wert 0 ("unbegrenzt") gilt, denn dann greift die Standard-Obergrenze von 100 Zeilen, was bedeutet, dass das Ergebnis nicht mehr als 100 "Gruppen"-Zeilen ausgibt.
Beispiele
Einfacher Anwendungsfall: Einstufige Gruppierung
Eine CSV Suche für Adressen soll eine eindeutige Liste aller Ausprägungen für das Feld "Postleitzahl" (zipcode) liefert, die in Adressbucheinträgen vorgefunden werden, für die Lesezugriff besteht.
Konfiguration:
Die CSV Suche wird wie rechts abgebildet konfiguriert:
Für alle weiteren Konfigurationsmerkmale wurden die für den Abfragekonfigurator anwendbaren Standardwerte beibehalten. Laufzeitbeispiel: zipcode ►HINWEIS◄ Der Wert "" steht hier für die Leere Zeichenfolge (""), die in einer CSV-Suche auch den $null-Wert repräsentiert. Nur deshalb kann die Liste diesen Wert hier doppelt enthalten. Eine Tupel-Suche würde die Unterschiedung von "" und $null transparent darstellen. |
|
►WICHTIG◄ Die CSV Suche wird in der gegebenen Konfiguration maximal 100 Postleitzahlen auflisten, da diese Obergrenze greift, wenn der Standardwert 0 für den Parameter Maximale Ergebnisse angegeben ist. Die effektive Obergrenze gibt ein Rückgabewert vom Typ "Sucherergebnis" (CsvSearchResult bzw. TupleSearchResult) im maxResults-Feld an.
Typischer Anwendungsfall: Gruppierung mit Aggregation
Das vorherige Beispiel soll nun um eine Ausgabespalte erweitert werden, die angibt, in wie vielen Adressbucheinträgen jeder zipcode-Wert gefunden wurde.
Konfiguration:
Wie im Screenshot rechts gezeigt, wurde die zusätzliche Spalte vor der bestehenden Feldprojektion für das "Postleitzahlfeld" (zipcode) eingerichtet:
|
|
Laufzeitbeispiel: COUNT of id,zipcode |
Die Beispieldaten (links) zeigen, die Ergebnisse der Aggregation. Die erste Spalte mit der automatisch bereitsgestellten Standard-Beschriftung "COUNT of id" gibt an, wie viele Adressbucheinträge sich auf die jeweilige "Postleitzahl" (zipcode) beziehen. Solange keine Sortierung definiert ist, ergibt sind die Reihenfolge der Ergebnisse aus der internen Logik der Datenbank beim Gruppieren. Falls mehr unterschiedliche Postleitzahlen in Adressbucheinträgen gefunden werden, als die Suche aufgrund der Einstellung für den Parameter "Maximale Ergebnisse" zurückgeben soll, liefert die Abfrage unter diesenn Bedingungen eine mehr oder weniger zufällige Teilmenge. Die nachfolgende Variante soll deshalb den Einsatz der Sortierung in Verbindung mit der Gruppierung demonstrieren. |
Variante:
Die bestehende CSV Suche soll nun so angepasst werden, dass als Suchergebnis die "TOP 10" der häufigsten Postleitzahlen in Adressbucheinträgen ausgibt.
Die Sortierung soll (natürlich) absteigend nach der Häufigkeit und - nur bei Gleichstand - aufsteigend nach der Postleitzahl erfolgen.
Konfiguration:
Der Screenshot rechts zeigt die zweistufige Sortierung an, die der CSV Suche hinzugefügt werden muss:
|
|
Dass nur die "TOP 10" aufgelistet wird, regel der Wert 10 für den Parameter Maximale Ergebnisse in Verbindung mit dem Standard-Offset-Wert 0 für Erstes Ergebnis. |
|
Laufzeitbeispiel: COUNT of id,zipcode |
Die Beispieldaten (links) zeigen die gewünschte "TOP 10". ►ANMERKUNG◄ Die beiden "häufigsten" Kategorien sind hier von den Werten Leere Zeichenfolge und $null belegt, was nicht unbedingt dem Sinn der "TOP 10" Bewertung entsprechen muss. Mit einer Bedingung wie der folgenden könnten beide "Störfälle" ausgeschlossen werden: |
Laufzeitbeispiel: COUNT of id,zipcode |
Die Beispieldaten (links) zeigen die gewünschte "TOP 10" inklusive der Bedingung (oben) für "Postleitzahl gefüllt". Leere Zeichenfolge und $null belegen nicht mehr die Spitzenplätze der Rangliste und am Ende sind zwei Einzeltreffer aufgerückt, die vorher nicht Teil der "TOP 10" waren. |
Komplexerer Anwendungsfall: Mehrstufige Gruppierung
In Anlehnung an die obige Aufgabenstellung soll nun noch sichergestellt werden, dass Adressbucheinträge mit übereinstimmender "Postleitzahl" (zipcode) aber unterschiedlichem "Land" (countryCode) unterschieden werden.
Bisher wurden diese nämlich ungerechtfertigter Weise durch die Gruppierung zusammengefasst.
Konfiguration:
Der bisherigen Konfiguration wird wie rechts abgebildet unter Gruppierung ein zusätzliches Gruppierungskriterium hinzugefügt:
|
|
Laufzeitbeispiel: COUNT of id,zipcode |
In den Beispieldaten (links) weist die Markierung auf den Effekt des zusätzlichen Gruppierungskriteriums hin:
►HINWEIS◄ Die zusätzliche Gruppierung nach dem "Land" (countryCode) wirkt also auch ohne Berücksichtigung in einer Ausgabespalte. |
Laufzeitbeispiel: COUNT of id,zipcode,countryCode Die zusätzliche Ausgabespalte (countryCode DE/FR) verdeutlicht, warum die "Postleitzahl" (40210) nun zwei Listenplätze belegt. |
Das zusätzliche Gruppierungskriterium soll allerdings auch transparent nachvollziehbar wirken. Also fügen wir die Feldprojektion für das "Land" (countryCode) auch unter den Projektionen als Ausgabespalte hinzu.
|
Komplexerer Anwendungsfall: Mehrstufige Gruppierung mit "Datenaufbereitung"
Die CSV Suche aus dem vorherigen Beispiel soll nun so umgestaltet werden, dass in den Projektionen für Gruppierung, Sortierung und Ausgabespalte nur noch das erste Zeichen der "Postleitzahl" (zipcode) berücksichtigt wird.
Sinngemäß soll eine "TOP 10" der Postleitzahlengebiete in den Adressbucheinträgen ermittelt werden.
Konfiguration:
Der Screenshot rechts zeigt den Abschnitt Gruppierung, wo das erste Gruppierungskriterium angepasst wurde:
|
|
Der Screenshot rechts zeigt, wie die Teilstring Projektion für den "Ausschnitt" aus der "Postleitzahl" als Projektion für eine Ausgabespalte umgesetzt werden kann:
|
|
Der Screenshot (rechts) zeigt die erforderliche Anpassung für die Sortierung:
|
|
Laufzeitbeispiel:
COUNT of id,MIN of substring of zipcode,countryCode
===================================================
4,8,DE
2,1,DE
2,3,BE
2,9,DE
1,1,CH
1,1,KH
1,2,DE
1,4,DE
1,4,FR
1,5,US
►ANMERKUNG◄ Anstelle der automatisch erzeugten Spaltentitel wären sinnvollere Zuordnungen für das Name-Feld der Ausgabespalten zu empfehlen.