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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |