mk-prg-net \ ms-sql \ tsql \queries \group-by

Group By – Resultset in Gruppen gliedern

Durch Group by wird ein Resultset bezüglich der Zeilen in disjunkte Teilmengen gegliedert. Die Teilmengen werden als Gruppen bezeichnet. Innerhalb einer Gruppe hat eine Auswahl von Spalten für alle Zeilen immer denselben Wert. Diese Spaltenauswahl wird auch als Gruppenschlüssel bezeichnet

  use dmsmin
go
-- Gesamter Speicherplatzverbrauch
select sum(SizeInBytes)
from data.FileInfos
-- Speicherplatzverbrauch pro Dateityp
select ext, sum(SizeInBytes)
from data.FileInfos
group by ext
-- Speicherplatzverbrauch pro Dateityp
select ext, sum(SizeInBytes) as [Size]
from data.FileInfos
group by ext
order by [Size] asc
-- Speicherplatzverbrauch pro Dateityp
select ext, sum(SizeInBytes) as [Size]
from data.FileInfos
group by ext
order by [Size] desc
-- Gruppieren: Wieviel Daten wurden pro Monat produziert
select year(mtime) as Jahr, Month(mtime) as Monat,  Sum(SizeInBytes)/1024.0 as SizeInKB 
from data.fileinfos
where SizeInBytes/1024.0 > 10 and (mtime between '1.1.2004' and '31.12.2005')
group by Year(mtime), Month(mtime)
order by Year(mtime), Month(mtime)

Having – Gruppen filtern

So wie die where Klausel einen Filterausdruck definiert, den alle Zeilen erfüllen müssen, die in das Resultset einfließen, definiert die Having- Klausel einen weiteren Filterausdruck, den alle Gruppen erfüllen müssen im Resultset.

Der Sinn von Having wird deutlich, wenn der Abfrageprozess, der zu den Gruppen führt, genauer betrachtet wird:

Phase

Aktionen

1

Datensätze aus den Quelltabellen laden

2

Datensätze entfernen, die Where Filterausdruck nicht erfüllen

3

Gruppieren bezüglich Group by

5

Pro Gruppe Spatenaggregate aus Select berechnen

6

Gruppen entfernen, die Having Filterausdruck nicht erfüllen

Beispiel:

  SELECT         ext, SUM(SizeInBytes) AS SumSizeInBytes
FROM           data.FileInfos
GROUP BY       ext
having         SUM(SizeInBytes) between 100000 and 200000
ORDER BY       SumSizeInBytes DESC