Compute By
Mittels dieser Anweisung kann eine Liste aus Detaildaten und Zusammenfassungen erstellt werden. Soll z.B. für die Beispieldatenbank DMS eine Liste mit den Inhalten aller Verzeichnisse, wobei zu jedem Verzeichnis die Größe in Byte auszugeben ist, dann kann dies durch folgenden Compute- By- Anweisung erreicht werden:
use dms go select dirs.[name], files.[name], [size] from dirs join files on dirs.dir_id = files.dir_id order by files.dir_id compute sum([size]) by files.dir_id
Achtung: Ein Compute- By- Select muß immer eine Order By – Klausel enthalten
Superaggregate (Rollup und Cube)
Eine Menge von Datensätzen kann in Gruppen und diese wiederum in Untergruppen unterteilt werden. Aus Gruppen werden in SQL gewöhnlich durch Aggregatfunktionen verdichtete Informationen gewonnen. Zusammenfassungen dazu werden mittels der Rollup- Funktion automatisch hinzugefügt. Bsp:
-- Berechnen der Verzeichnisgrößen + Gesamtgröße der Doku- Webseite use DMS go select dirs.[name], round(sum(files.size)/(1024.0*1024.0), 3) as DirSize from dirs join files on dirs.dir_id = files.dir_id where dirs.[name] like '%\trac\projekt\%\trac_neu\wissen\%' group by dirs.[name] with rollup
Ergebnis:
name DirSize
---------------------------------------------------------------------------- -----------------------------------
d:\trac\projekt\www\trac_neu\wissen\datenbanken 1.481000000000
d:\trac\projekt\www\trac_neu\wissen\datenbanken\ms-sql-server 2.816000000000
d:\trac\projekt\www\trac_neu\wissen\datenbanken\solar_pics .990000000000
d:\trac\projekt\www\trac_neu\wissen\datensicherheit 4.678000000000
d:\trac\projekt\www\trac_neu\wissen\dot-net 5.795000000000
d:\trac\projekt\www\trac_neu\wissen\einfuehrung 1.348000000000
d:\trac\projekt\www\trac_neu\wissen\html 2.008000000000
d:\trac\projekt\www\trac_neu\wissen\html\php-mysql .103000000000
d:\trac\projekt\www\trac_neu\wissen\netzwerk 5.098000000000
d:\trac\projekt\www\trac_neu\wissen\netzwerk\router .660000000000
d:\trac\projekt\www\trac_neu\wissen\netzwerk\router\router .028000000000
d:\trac\projekt\www\trac_neu\wissen\pc-technik 1.621000000000
d:\trac\projekt\www\trac_neu\wissen\programmieren 2.029000000000
d:\trac\projekt\www\trac_neu\wissen\programmieren\cpp 2.049000000000
d:\trac\projekt\www\trac_neu\wissen\programmieren\cpp\com .129000000000
d:\trac\projekt\www\trac_neu\wissen\programmieren\cpp\projekt_browser .138000000000
d:\trac\projekt\www\trac_neu\wissen\programmieren\versionen .076000000000
NULL 31.048000000000
Die Zusammenfassung ist ein neuer Datensatz im Resultset, der in der gruppierten Spalten den Wert Null enthält.
Zusammenfassungen mittels Cube:
-- Berechnen der Verzeichnisgrößen + Gesamtgröße der Doku- Webseite use DMS go select dirs.[name], files.ext, round(sum(files.size)/(1024.0*1024.0), 3) as DirSize from dirs join files on dirs.dir_id = files.dir_id where dirs.[name] like '%\trac\projekt\%\trac_neu\wissen\%' group by dirs.[name], files.ext with cube
Ergebnis: