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;
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;
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.