Mehrfachgruppierung
Das Prinzip der Mehrfachgruppierung wird dann eingesetzt, wenn innerhalb einer einzelnen Anfrage der Originaldatenbestand mehrfach nach unterschiedlichen Kriterien gruppiert werden soll. Mehrfachgruppierung steht dabei im Gegensatz zu einer (einmaligen) Gruppierung über mehrere Attribute. Im laufenden Beispiel soll das Durchschnittsalter sowohl nach Geschlecht als auch nach Berufsgruppe mit folgendem Ergebnis berechnet werden:
<MedizinischesPersonal>
<MedizinischesPersonal_nach_Beruf>
<Berufsgruppe>
<Beruf>Arzt</Beruf>
<Alter>28</Alter>
</Berufsgruppe>
<Berufsgruppe>
<Beruf>Pfleger</Beruf>
<Alter>53</Alter>
</Berufsgruppe>
</MedizinischesPersonal_nach_Beruf>
<MedizinischesPersonal_nach_Geschlecht>
<Geschlechtsgruppe>
<Geschlecht>m</Geschlecht>
<Alter>28</Alter>
</Geschlechtsgruppe>
<Geschlechtsgruppe>
<Geschlecht>w</Geschlecht>
<Alter>53</Alter>
</Geschlechtsgruppe>
</MedizinischesPersonal_nach_Geschlecht>
</MedizinischesPersonal>
Die dazu korrespondierende XQuery ergibt sich mit zwei hintereinander liegenden FLWOR-Blöcken wie folgt:
<MedizinischesPersonal>
<MedizinischesPersonal_nach_Beruf>
{
for $b in fn:distinct-values(
for $i in fn:doc("...")//MedizinischesPersonal/*/*
return fn:name($i))
let $x := fn:doc("...")//*[fn:name(.) = $b]/Alter
return <Berufsgruppe>
<Beruf>{ $b }</Beruf>
<Alter>{ fn:avg($x) }</Alter>
</Berufsgruppe>
}
</MedizinischesPersonal_nach_Beruf>
<MedizinischesPersonal_nach_Geschlecht>
{
for $g in fn:distinct-values(fn:doc("...")//Geschlecht)
let $x := fn:doc("...")//*[Geschlecht=$g]/Alter
return <Geschlechtsgruppe>
<Geschlecht>{ $g }</Geschlecht>
<Alter>{ fn:avg($x) }</Alter>
</Geschlechtsgruppe>
}
</MedizinischesPersonal_nach_Geschlecht>
</MedizinischesPersonal>
Weisen zwei Gruppierungskombinationen gleiche Gruppierungseigenschaften auf, so kann die Gemeinsamkeit dahingehend ausgenützt werden, dass nur eine einzige Variable definiert werden muss und gemeinsam genutzt werden kann.
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |