Klauzula GROUP BY w MsSQL

1. GROUP BY w SQL Server – Jak grupować rekordy?

W tym rozdziale dowiesz się jak korzystać z klauzuli grupujące GROUP BY w SQL Server. Funkcje agregujące MsSQL, które poznałeś w poprzednim rozdziale takie jak SUM, MIN, MAX, AVG, COUNT działają z klauzulą grupującą GROUP BY. Oznacza to dla nas tyle, że używając funkcji agregujących możemy jednocześnie grupować rekordy w wyniku zapytnia tak, jak w poniższym przykładzie wykonanym na bazie AdventureWorks2016:

use [AdventureworksDW2016CTP3]
go

select 
a.gender,
SUM(a.VacationHours) as COL_1,
AVG(a.VacationHours) as COL_2,
MIN(a.VacationHours) as COL_3,
MAX(a.VacationHours) as COL_4,
COUNT(a.EmployeeKey) as COL_5
from dbo.DimEmployee a 
GROUP BY a.gender;
SQL Server Group By - grupowanie rekordów
SQL Server Group By – grupowanie rekordów

2. Przykład grupowania w SQL Server – GROUP BY HAVING

Grupowanie GROUP BY w SQL Server możemy wykonać na więcej niż jednej kolumnie. Możemy np na naszej bazie wykonać obliczenie sumy, średniej, min, max godzin urlopu (VacationHours) w danych departamentach wg. płci. Przykład takiego obliczenia zamieszczam poniżej. Dodatkowo w zapytaniu użyjemy klauzuli WHERE, w której zawężymy przeszukiwaną tabelę do obecnych pracowników, a więc posiadających w kolumnie Status wartość ’Current’.

use [AdventureworksDW2016CTP3]
go

select 
a.DepartmentName,
a.gender,
SUM(a.VacationHours) as COL_1,
AVG(a.VacationHours) as COL_2,
MIN(a.VacationHours) as COL_3,
MAX(a.VacationHours) as COL_4,
COUNT(a.EmployeeKey) as COL_5
from dbo.DimEmployee a 
WHERE a.status = 'Current'
GROUP BY a.DepartmentName,
a.gender;

Zauważ, że warunek ujęty w klauzuli WHERE działa przed grupowaniem. Oznacza to tyle, że do grupowania zostały wzięte tylko te rekordy, które w kolumnie Status posiadają wartość ’Current’. Co jednak, jeśli chcemy, by zapytanie dodatkowo filtrowało wynik po dokonaniu grupowania? Służy do tego klauzula HAVING. HAVING  w odróżnieniu od WHERE działa po dokonaniu grupowania. Oznacza, to tyle, że wynik po dokonaniu grupowania jest jeszcze zawężany o dodatkowe kryteria. Warunkiem tym może być np to, że bieżemy pod uwagę tylko grupy pracowników, które posiadają średnią liczbę godzin urlopu(VacationHours) większą lub równą od 70. Klauzulę HAVING wstawiamy po grupowaniu GROUP BY. Przykład poniżej:

use [AdventureworksDW2016CTP3]
go

select 
a.DepartmentName,
a.gender,
SUM(a.VacationHours) as COL_1,
AVG(a.VacationHours) as COL_2,
MIN(a.VacationHours) as COL_3,
MAX(a.VacationHours) as COL_4,
COUNT(a.EmployeeKey) as COL_5
from dbo.DimEmployee a 
WHERE a.status = 'Current'
GROUP BY a.DepartmentName,
a.gender
HAVING AVG(a.VacationHours) >= 70;
GROUP BY w SQL Server - HAVING
GROUP BY w SQL Server – HAVING

3. Grupowanie, a użycie funkcji 

Jeśli w kolumnach wg. których grupujesz dane chcesz użyć funkcji, bądź instrukcji CASE, pamiętaj że powinieneś to zapisać także w klauzuli GROUP BY. Przykład takiego grupowania zamieszczam poniżej:

use [AdventureworksDW2016CTP3]
go

select 
YEAR(a.StartDate) AS YR_COL,
a.DepartmentName,
CASE a.gender
WHEN 'M' THEN 'MAN'
WHEN 'W' THEN 'WOMAN'
ELSE NULL END AS GENDER,
SUM(a.VacationHours) as COL_SUM
from dbo.DimEmployee a 
WHERE a.status = 'Current'
GROUP BY 
YEAR(a.StartDate),
a.DepartmentName,
CASE a.gender
WHEN 'M' THEN 'MAN'
WHEN 'W' THEN 'WOMAN'
ELSE NULL END
HAVING AVG(a.VacationHours) >= 70
;

Artykuł stanowi częśc kursu SQL Server. Jeśli masz jakieś pytania, możesz je zamieścić na forum bez logowania lub zostawić komentarz.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *