Rozbudujmy trochę nasze zapytanie z rozdziału o funkcjach agregujących. Do tej pory wynikiem powyższych operacji był jeden rekord. Chcemy jednak, by np nasza tabela pokazała nam te same statystyki, ale np zagregowane do co do koloru w kolumnie kolor. Korzystamy w tym celu z klauzuli GROUP BY. Dopisujemy ją na końcu naszego zapytania. W klauzuli SELECT wpisujemy kolumnę color, w klauzuli GROUP BY także:
use AdventureWorks2014; select color, sum(listprice) as suma, --suma cen avg(listprice) as avg1, -- średnia cena min(listprice) as min1, -- najmniejsza cena max(listprice) as max1, --największa cena count(listprice) as count1, --liczba rekordów niepustych count(1) as count2, count(color) as count3, min(color) as min2, max(color) as max2 from Production.Product group by Color go
Wynikiem powyższego zapytania będą rekordy zagregowane do kolumny kolor. Agregację można wykonywać dla dowolnej liczby kolumn jednocześnie. Jeśli chcemy wykluczyć niektóre rekordy przed wykonaniem naszych funkcji korzystamy z klauzuli WHERE. Jeśli jednak chcemy wykluczyć jakieś rekordy już z wyniku grupowania korzystamy w tym celu z klauzuli HAVING. Poniżej zastosowanie.
use AdventureWorks2014;
select
color,
sum(listprice) as suma, --suma cen
avg(listprice) as avg1, -- średnia cena
min(listprice) as min1, -- najmniejsza cena
max(listprice) as max1, --największa cena
count(listprice) as count1, --liczba rekordów niepustych
count(1) as count2,
count(color) as count3,
min(color) as min2,
max(color) as max2
from Production.Product
where color in ('Black','Blue','Yellow') --bierzemy tylko te kolory przed wykonaniem grupowania
group by Color
having count(listprice) > 30 -- bierzemy rekordy o liczbie więszej niż 30 dla danego koloru po wykonaniu grupowania
;
go