mk-prg-net \ ms-sql \ tsql \queries \superaggregate

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: