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