4.1 Grupowanie kolumn

Bardzo ważne jest również to, że jeśli grupujesz rekordy, to w sekcji SELECTmożesz określić tylko kolumny, według których dane są grupowane.

TyNie mogęnapisz zapytanie typu i określ SELECTkolumnę name w sekcji :

SELECT brand, name
FROM product
GROUP BY brand

Masz kilka wierszy w tabeli produktów z polem nazwa i nie jest jasne, który wiersz należy tutaj zastąpić. Pomyśl jeszcze raz: chcesz poznać liczbę produktów każdej marki i jak wynikowa tabela może uzyskać nazwę produktu?

Jeśli użyjesz operatora GROUP BY, wtedy normalne wiersze nie mogą dostać się do twojego wyniku, a jedynie kolumny, według których dane są grupowane i „kolumny obliczeniowe”, takie jakCOUNT(*)

4.2 Grupowanie według kolumn obliczeniowych

Ale możesz grupować według wielu kolumn, a nawet według kolumn obliczeniowych. Przykład:

SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year

I wynik tego zapytania:

rok_wynajmu całkowity
2012 1
2013 1
2014 1
2015 2
2018 1

Przeanalizujmy naszą prośbę.

W tabeli pracowników każdy pracownik ma unikalną datę zatrudnienia, więc grupowanie danych według niej nie zadziała - będzie jeden rekord dla każdej daty i grupowanie nie będzie miało większego sensu. Ale jeśli przejdziemy od daty zatrudnienia do roku zatrudnienia, to równie dobrze może to być sytuacja, w której firma zatrudniła kilku pracowników w tym samym roku.

Zobaczmy jeszcze raz, jak ta tabela będzie wyglądać przed grupowaniem:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	join_date
FROM employee

I wynik tego zapytania:

ID nazwa rok_wynajmu data_dołączenia
1 Iwanow Iwan 2012 2012-06-30
2 Pietrow Pietr 2013 2013-08-12
3 Iwanow Siergiej 2014 2014-01-01
4 Rabinowicz Mojsza 2015 2015-05-12
5 Kirienko Anastazja 2015 2015-10-10
6 Vaska 2018 2018-11-11

Ale wynikową tabelę można pogrupować według roku zatrudnienia i dowiedzieć się, ile osób zostało zatrudnionych w danym roku.

4.3 Grupowanie według wielu kolumn

Teraz spróbujmy dowiedzieć się, ilu pracowników zatrudnialiśmy w każdym miesiącu każdego roku. Aby to zrobić, musimy dodać jednocześnie do zapytania nie jedno, a dwa pola obliczeniowe - rok zatrudnienia (rok_zatrudnienia) oraz miesiąc zatrudnienia (miesiąc_zatrudnienia).

Napiszmy takie zapytanie:

SELECT
 	id,
 	name,
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	join_date
FROM employee

I wynik tego zapytania:

ID nazwa rok_wynajmu miesiąc_wynajmu data_dołączenia
1 Iwanow Iwan 2012 6 2012-06-30
2 Pietrow Pietr 2013 8 2013-08-12
3 Iwanow Siergiej 2014 1 2014-01-01
4 Rabinowicz Mojsza 2015 5 2015-05-12
5 Kirienko Anastazja 2015 10 2015-10-10
6 Vaska 2018 jedenaście 2018-11-11

Jeśli pogrupujemy dane w tej tabeli wyników według miesięcy, po prostu pogrupujemy ludzi w grupy, niezależnie od roku, w którym zostali zatrudnieni. I potrzebujemy, aby wynikowa tabela miała trzy kolumny: rok, miesiąc i liczbę zatrudnionych pracowników.

Aby to zrobić, po operatorze GROUP BYmusisz użyć nazwy nie jednej kolumny, ale dwóch. Przykład:

SELECT
 	YEAR(join_date) AS hire_year,
 	MONTH(join_date) AS hire_month,
 	COUNT(*) AS total
FROM employee
GROUP BY hire_year, hire_month

I wynik tego zapytania:

rok_wynajmu miesiąc_wynajmu całkowity
2012 6 1
2013 8 1
2014 1 1
2015 5 1
2015 10 1
2018 jedenaście 1

Mamy niewiele rekordów w tabeli, więc w kolumnie sumy są wszędzie jednostki. A tak przy okazji, zauważ, że im więcej kolumn pogrupujemy, tym więcej wierszy otrzymamy w wyniku.