4.1 Gruppering af kolonner
Hvad der også er meget vigtigt er, at hvis du grupperer poster, så kan du i afsnittet SELECT
kun angive de kolonner, som dataene er grupperet efter.
Dukan ikkeskriv en typeforespørgsel og angiv SELECT
navnekolonnen i sektionen :
SELECT brand, name
FROM product
GROUP BY brand
Du har en masse rækker i produkttabellen med navnefeltet , og det er ikke klart, hvilken række du skal erstatte her. Tænk igen: du vil vide antallet af produkter fra hvert mærke, og hvordan den resulterende tabel kan få navnet på produktet?
Hvis du bruger operatoren GROUP BY
, så kan normale rækker ikke komme ind i dit resultat, men kun kolonner som data grupperes efter og "beregnede kolonner", som f.eks.COUNT(*)
4.2 Gruppering efter beregnede kolonner
Men du kan gruppere efter flere kolonner og endda efter beregnede kolonner. Eksempel:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
Og resultatet af denne forespørgsel:
ansættelsesår | Total |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
Lad os analysere vores anmodning.
I medarbejdertabellen har hver medarbejder en unik ansættelsesdato, så gruppering af data efter den vil ikke fungere - der vil være én post for hver dato, og gruppering vil ikke give meget mening. Men flytter vi fra ansættelsesdatoen til ansættelsesåret, så kan det godt være en situation, hvor virksomheden ansatte flere medarbejdere i samme år.
Lad os se igen, hvordan denne tabel vil se ud før gruppering:
SELECT
id,
name,
YEAR(join_date) AS hire_year,
join_date
FROM employee
Og resultatet af denne forespørgsel:
id | navn | ansættelsesår | join_date |
---|---|---|---|
1 | Ivanov Ivan | 2012 | 2012-06-30 |
2 | Petrov Petr | 2013 | 2013-08-12 |
3 | Ivanov Sergey | 2014 | 2014-01-01 |
4 | Rabinovich Moisha | 2015 | 2015-05-12 |
5 | Kirienko Anastasia | 2015 | 2015-10-10 |
6 | Vaska | 2018 | 2018-11-11 |
Men denne resulterende tabel kan grupperes efter hire_year og finde ud af, hvor mange personer der blev ansat i et bestemt år.
4.3 Gruppering efter flere kolonner
Lad os nu prøve at finde ud af, hvor mange medarbejdere vi har ansat i hver måned hvert år. For at gøre dette skal vi tilføje ikke ét, men to beregnede felter til forespørgslen på én gang - lejeåret (hyre_år) og lejemåneden (hyre_måned).
Lad os skrive en forespørgsel som denne:
SELECT
id,
name,
YEAR(join_date) AS hire_year,
MONTH(join_date) AS hire_month,
join_date
FROM employee
Og resultatet af denne forespørgsel:
id | navn | ansættelsesår | leje_måned | join_date |
---|---|---|---|---|
1 | Ivanov Ivan | 2012 | 6 | 2012-06-30 |
2 | Petrov Petr | 2013 | 8 | 2013-08-12 |
3 | Ivanov Sergey | 2014 | 1 | 2014-01-01 |
4 | Rabinovich Moisha | 2015 | 5 | 2015-05-12 |
5 | Kirienko Anastasia | 2015 | 10 | 2015-10-10 |
6 | Vaska | 2018 | elleve | 2018-11-11 |
Hvis vi grupperer dataene i denne resultattabel efter måned, så grupperer vi simpelthen folk i grupper, uanset hvilket år de blev ansat. Og vi har brug for, at den resulterende tabel har tre kolonner: år, måned og antallet af ansatte.
For at gøre dette, efter operatøren, GROUP BY
skal du bruge navnet på ikke en kolonne, men to. Eksempel:
SELECT
YEAR(join_date) AS hire_year,
MONTH(join_date) AS hire_month,
COUNT(*) AS total
FROM employee
GROUP BY hire_year, hire_month
Og resultatet af denne forespørgsel:
ansættelsesår | leje_måned | Total |
---|---|---|
2012 | 6 | 1 |
2013 | 8 | 1 |
2014 | 1 | 1 |
2015 | 5 | 1 |
2015 | 10 | 1 |
2018 | elleve | 1 |
Vi har få poster i tabellen, så der er enheder overalt i totalkolonnen. Og bemærk i øvrigt, at jo flere kolonner vi grupperer efter, jo flere rækker har vi i resultatet.
GO TO FULL VERSION