Zoeken…
Invoering
Resultaten van een SELECT-query kunnen worden gegroepeerd op een of meer kolommen met behulp van de GROUP BY
instructie: alle resultaten met dezelfde waarde in de gegroepeerde kolommen worden samengevoegd. Dit genereert een tabel met gedeeltelijke resultaten in plaats van één resultaat. GROUP BY kan worden gebruikt in combinatie met aggregatiefuncties met behulp van de HAVING
instructie om te definiëren hoe niet-gegroepeerde kolommen worden geaggregeerd.
Syntaxis
GROEP OP {
kolom-expressie
| ROLLUP (<group_by_expression> [, ... n])
| CUBE (<group_by_expression> [, ... n])
| GROEPINGSSETS ([, ... n])
| () - berekent het eindtotaal
} [, ... n]<group_by_expression> :: =
kolom-expressie
| (kolomuitdrukking [, ... n])<grouping_set> :: =
() - berekent het eindtotaal
| <Grouping_set_item>
| (<grouping_set_item> [, ... n])<grouping_set_item> :: =
<Group_by_expression>
| ROLLUP (<group_by_expression> [, ... n])
| CUBE (<group_by_expression> [, ... n])
GEBRUIK GROEP DOOR tot het aantal rijen voor elk uniek item in een bepaalde kolom
Stel dat u tellingen of subtotalen voor een bepaalde waarde in een kolom wilt genereren.
Gegeven deze tabel, "Westerosians":
Naam | GreatHouseAllegience |
---|---|
Arya | strak |
Cercei | Lannister |
Myrcella | Lannister |
Yara | Greyjoy |
Catelyn | strak |
Sansa | strak |
Zonder GROUP BY zal COUNT gewoon een totaal aantal rijen retourneren:
SELECT Count(*) Number_of_Westerosians
FROM Westerosians
geeft terug...
Number_of_Westerosians |
---|
6 |
Maar door GROUP BY toe te voegen, kunnen we de gebruikers TELLEN voor elke waarde in een bepaalde kolom, om het aantal mensen in een bepaald Great House te retourneren, bijvoorbeeld:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
geeft terug...
Huis | Number_of_Westerosians |
---|---|
strak | 3 |
Greyjoy | 1 |
Lannister | 2 |
Het is gebruikelijk om GROUP BY te combineren met ORDER BY om resultaten te sorteren op grootste of kleinste categorie:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc
geeft terug...
Huis | Number_of_Westerosians |
---|---|
strak | 3 |
Lannister | 2 |
Greyjoy | 1 |
Filter GROUP BY-resultaten met een HAVING-clausule
Een HAVING-clausule filtert de resultaten van een GROUP BY-expressie. Opmerking: de volgende voorbeelden gebruiken de voorbeelddatabase van Bibliotheek .
Voorbeelden:
Retourneer alle auteurs die meer dan één boek hebben geschreven ( live voorbeeld ).
SELECT
a.Id,
a.Name,
COUNT(*) BooksWritten
FROM BooksAuthors ba
INNER JOIN Authors a ON a.id = ba.authorid
GROUP BY
a.Id,
a.Name
HAVING COUNT(*) > 1 -- equals to HAVING BooksWritten > 1
;
Retourneer alle boeken met meer dan drie auteurs ( live voorbeeld ).
SELECT
b.Id,
b.Title,
COUNT(*) NumberOfAuthors
FROM BooksAuthors ba
INNER JOIN Books b ON b.id = ba.bookid
GROUP BY
b.Id,
b.Title
HAVING COUNT(*) > 3 -- equals to HAVING NumberOfAuthors > 3
;
Basic GROUP BY-voorbeeld
Het kan gemakkelijker zijn als u GROUP BY als "voor elk" beschouwt ter verduidelijking. De onderstaande vraag:
SELECT EmpID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
zegt:
"Geef me de som van maandelijks salaris voor elke EmpID"
Dus als je tafel er zo uitzag:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Resultaat:
+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
Som lijkt niets te doen omdat de som van één getal dat getal is. Aan de andere kant als het er zo uitzag:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|1 |300 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Resultaat:
+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
Dan zou het omdat er twee EmpID 1's zijn om samen te tellen.
ROLAP-aggregatie (datamining)
Beschrijving
De SQL-standaard biedt twee extra aggregatie-operators. Deze gebruiken de polymorfe waarde "ALL" om de verzameling van alle waarden aan te geven die een attribuut kan aannemen. De twee operatoren zijn:
-
with data cube
dat het alle mogelijke combinaties biedt dan de argumentattributen van de clausule. -
with roll up
samengevat dat het de verkregen aggregaten levert door de attributen in volgorde van links naar rechts te beschouwen vergeleken met hoe ze worden vermeld in het argument van de clausule.
SQL-standaardversies die deze functies ondersteunen: 1999,2003,2006,2008,2011.
Voorbeelden
Beschouw deze tabel:
Voedsel | Merk | Totale hoeveelheid |
---|---|---|
Pasta | Merk 1 | 100 |
Pasta | Merk 2 | 250 |
Pizza | Merk 2 | 300 |
Met kubus
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
Voedsel | Merk | Totale hoeveelheid |
---|---|---|
Pasta | Merk 1 | 100 |
Pasta | Merk 2 | 250 |
Pasta | ALLEMAAL | 350 |
Pizza | Merk 2 | 300 |
Pizza | ALLEMAAL | 300 |
ALLEMAAL | Merk 1 | 100 |
ALLEMAAL | Merk 2 | 550 |
ALLEMAAL | ALLEMAAL | 650 |
Met oprollen
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
Voedsel | Merk | Totale hoeveelheid |
---|---|---|
Pasta | Merk 1 | 100 |
Pasta | Merk 2 | 250 |
Pizza | Merk 2 | 300 |
Pasta | ALLEMAAL | 350 |
Pizza | ALLEMAAL | 300 |
ALLEMAAL | ALLEMAAL | 650 |