4.1 Oszlopok csoportosítása
Ami még nagyon fontos, hogy ha rekordokat csoportosítunk, akkor a szekcióban SELECT
csak azokat az oszlopokat tudjuk megadni, amelyek szerint csoportosulnak az adatok.
tenem tudírjon egy típusú lekérdezést, és adja meg a névSELECT
oszlopot a szakaszban :
SELECT brand, name
FROM product
GROUP BY brand
Van egy csomó sor a terméktáblázatban a névmezővel , és nem egyértelmű, hogy melyik sort kell itt helyettesítenie. Gondolja át újra: szeretné tudni, hogy az egyes márkák hány terméke van, és hogyan kaphatja meg a kapott táblázat a termék nevét?
Ha az operátort használja GROUP BY
, akkor normál sorok nem kerülhetnek be az eredménybe, hanem csak az adatok csoportosítására szolgáló oszlopok és a „számított oszlopok”, mint pl.COUNT(*)
4.2 Csoportosítás számított oszlopok szerint
De csoportosíthat több oszlop, sőt számított oszlopok szerint is. Példa:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
És ennek a lekérdezésnek az eredménye:
bérlés_év | teljes |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
Elemezzük kérésünket.
Az alkalmazottak táblázatában minden alkalmazottnak egyedi felvételi dátuma van, így az adatok csoportosítása nem fog működni – minden dátumhoz egy rekord tartozik, és a csoportosításnak nincs sok értelme. De ha a felvétel időpontjáról áttérünk a felvétel évére, akkor könnyen előfordulhat, hogy a cég több alkalmazottat vett fel ugyanabban az évben.
Nézzük meg újra, hogyan fog kinézni ez a táblázat a csoportosítás előtt:
SELECT
id,
name,
YEAR(join_date) AS hire_year,
join_date
FROM employee
És ennek a lekérdezésnek az eredménye:
id | név | bérlés_év | csatlakozás dátuma |
---|---|---|---|
1 | Ivanov Iván | 2012 | 2012-06-30 |
2 | Petrov Petr | 2013 | 2013-08-12 |
3 | Ivanov Szergej | 2014 | 2014-01-01 |
4 | Rabinovics Moisa | 2015 | 2015-05-12 |
5 | Kirienko Anasztázia | 2015 | 2015-10-10 |
6 | Vaska | 2018 | 2018-11-11 |
De ez a kapott táblázat csoportosítható a bérbeadás_év szerint , és megtudhatja, hány embert vettek fel egy adott évben.
4.3 Csoportosítás több oszlop szerint
Most próbáljuk meg kideríteni, hány alkalmazottat vettünk fel minden egyes hónapban. Ehhez nem egy, hanem egyszerre két számított mezőt kell hozzáadnunk a lekérdezéshez - a bérlés évét (hire_year) és a bérlés hónapját (hire_month).
Írjunk egy ilyen lekérdezést:
SELECT
id,
name,
YEAR(join_date) AS hire_year,
MONTH(join_date) AS hire_month,
join_date
FROM employee
És ennek a lekérdezésnek az eredménye:
id | név | bérlés_év | bérlési_hónap | csatlakozás dátuma |
---|---|---|---|---|
1 | Ivanov Iván | 2012 | 6 | 2012-06-30 |
2 | Petrov Petr | 2013 | 8 | 2013-08-12 |
3 | Ivanov Szergej | 2014 | 1 | 2014-01-01 |
4 | Rabinovics Moisa | 2015 | 5 | 2015-05-12 |
5 | Kirienko Anasztázia | 2015 | 10 | 2015-10-10 |
6 | Vaska | 2018 | tizenegy | 2018-11-11 |
Ha ebben az eredménytáblázatban az adatokat havonta csoportosítjuk, akkor egyszerűen csoportokba csoportosítjuk az embereket, függetlenül attól, hogy melyik évben vették fel őket. Az eredményül kapott táblázatnak három oszlopot kell tartalmaznia: év, hónap és a felvett alkalmazottak száma.
Ehhez az operátor után GROUP BY
nem egy oszlop nevét kell használni, hanem kettőt. Példa:
SELECT
YEAR(join_date) AS hire_year,
MONTH(join_date) AS hire_month,
COUNT(*) AS total
FROM employee
GROUP BY hire_year, hire_month
És ennek a lekérdezésnek az eredménye:
bérlés_év | bérlési_hónap | teljes |
---|---|---|
2012 | 6 | 1 |
2013 | 8 | 1 |
2014 | 1 | 1 |
2015 | 5 | 1 |
2015 | 10 | 1 |
2018 | tizenegy | 1 |
Kevés rekord van a táblázatban, ezért az összesített oszlopban mindenhol egységek vannak. És mellesleg vegye figyelembe, hogy minél több oszlop alapján csoportosítunk, annál több sor lesz az eredményben.
GO TO FULL VERSION