Użycie GROUP BY – SQL
GROUP BY – wstęp
Klauzula GROUP BY jest klauzulą w instrukcji SELECT. Pozwala tworzyć grupy wartości podczas korzystania z funkcji agregujących.
Funkcje agregujące bez GROUP BY zwrócą pojedynczą wartość.
Jeśli chcesz znaleźć wartość zagregowaną dla każdej wartości X, możesz Pogrupować według x, aby ją znaleźć.
Pozwala znaleźć odpowiedzi na problemy, takie jak:
- Całkowita liczba sprzedaży miesięcznie
- Średnia pensja pracownika na dział
- Liczba studentów zapisanych na rok
Instrukcja SELECT może wyglądać następująco:
1 2 3 4 5 6 |
SELECT columns FROM table WHERE condition GROUP BY columns HAVING condition ORDER BY columns |
Przykład 1 – COUNT
Powiedzmy, że chcemy znaleźć COUNT rekordów ocen uczniów rocznie.
Nasze zapytanie musiałoby zawierać rok i COUNT każdego roku.
1 2 3 4 |
SELECT school_year, COUNT(*) FROM sample_group_table GROUP BY school_year; |
Umieszczamy kolumnę school_year w klauzuli GROUP BY, ponieważ chcemy pokazać wynik COUNT dla każdej instancji school_year. Ponadto, gdy korzystamy z funkcji agregujących, musimy dodać dowolne niezgregowane kolumny do GROUP BY. W przeciwnym razie otrzymamy błąd.
Uruchommy więc to zapytanie:
ROK SZKOLNY | COUNT(*) |
2013 | 325 |
2014 | 349 |
2015 r | 326 |
Przykład 2 – MAKS
Co jeśli chcielibyśmy znaleźć maksymalną liczbę punktów za każdy przedmiot, niezależnie od studenta lub roku?
Pokazalibyśmy ID przedmiotu i funkcję MAX .
1 2 3 4 |
SELECT subject_id, MAX(student_grade) AS max_score FROM sample_group_table GROUP BY subject_id; |
SUBJECT_ID | MAX_SCORE |
1 | 99,62 |
6 | 99,61 |
2 | 99 |
5 | 99,19 |
4 | 99,26 |
8 | 98,75 |
Przykład 3 – GROUP BY według kolumn
Możemy również użyć więcej niż jednej kolumny w klauzuli GROUP BY.
Powiedzmy, że chcieliśmy zobaczyć SUMĘ wszystkich ocen uczniów przez wszystkie lata.
Nasze zapytanie wyglądałoby tak:
1 2 3 4 5 6 |
SELECT student_id, school_year, SUM(student_grade) AS total FROM sample_group_table GROUP BY student_id, school_year ORDER BY student_id, school_year; |
INDEX | ROK SZKOLNY |
TOTAL |
1 | 2013 | 1455,48 |
1 | 2014 | 1179,21 |
1 | 2015 r | 1633,92 |
2 | 2013 | 1495,94 |
2 | 2014 | 1702.22 |
2 | 2015 r | 1452,95 |
3 | 2013 | 1589,43 |
3 | 2014 | 1630,19 |
3 |
2015 r |
1841.6 |
Pokazuje identyfikator ucznia, rok szkolny i sumę ocen ucznia dla tych wartości.
GROUP BY ROLLUP
Klauzula SQL GROUP BY ma w niej coś więcej niż tylko określenie kolumn do grupowania.
Dostępnych jest kilka różnych opcji grupowania, a jedną z nich jest ROLLUP.
Typ grupowania ROLLUP SQL umożliwia grupowanie według sum częściowych i sumy całkowitej.
Jest to dostępne w Oracle, SQL Server, MySQL i PostgreSQL.
To wygląda tak:
1 2 3 4 5 6 |
SELECT student_id, school_year, AVG(student_grade) AS avg_grades FROM sample_group_table GROUP BY ROLLUP (student_id, school_year) ORDER BY student_id, school_year; |
Spowoduje to utworzenie poziomów grupowania dla:
- Każda kombinacja student_id i school_year
- Suma cząstkowa dla każdego ID_ studenta
- Ogólna suma
INDEX | ROK SZKOLNY | AVG_GRADES |
1 | 2013 | 48,516 |
1 | 2014 | 49.13375 |
1 | 2015 | 54,79733333 |
1 | null | 50,93583333 |
2 | 2013 | 51.58413793 |
2 | 2014 | 58,69724138 |
2 | 2015 | 48,43166667 |
2 | null | 52,85352273 |
Zapraszam do polubienia fanpage Facebook “Umiejętności miękkie w IT”
Ostatecznie w zamian za dostarczoną treść, proszę więcej uśmiechu w cyfrowym świecie! 😉