Sök…
Introduktion
Resultaten av en VÄLJ SELECT kan grupperas med en eller flera kolumner med hjälp av GROUP BY
: alla resultat med samma värde i de grupperade kolumnerna sammanförs. Detta genererar en tabell över partiella resultat istället för ett resultat. GROUP BY kan användas i kombination med aggregeringsfunktioner med hjälp av HAVING
uttalandet för att definiera hur icke-grupperade kolumner ska aggregeras.
Syntax
GRUPP AV {
kolonn-expression
| ROLLUP (<grupp_by_uttryck> [, ... n])
| CUBE (<grupp_by_uttryck> [, ... n])
| GRUPPERINSTÄLLNINGAR ([, ... n])
| () - beräknar totalbeloppet
} [, ... n]<grupp_by_uttryck> :: =
kolonn-expression
| (kolumnuttryck [, ... n])<grupp_set> :: =
() - beräknar totalbeloppet
| <Grouping_set_item>
| (<grupp_set_item> [, ... n])<grupp_set_item> :: =
<Group_by_expression>
| ROLLUP (<grupp_by_uttryck> [, ... n])
| CUBE (<grupp_by_uttryck> [, ... n])
ANVÄND GRUPP AV för att COUNT antalet rader för varje unik post i en given kolumn
Låt oss säga att du vill generera räkningar eller delsiffror för ett visst värde i en kolumn.
Med tanke på denna tabell, "Westerosians":
namn | GreatHouseAllegience |
---|---|
Arya | Stark |
Cercei | Lannister |
Myrcella | Lannister |
Yara | Greyjoy |
Catelyn | Stark |
Sansa | Stark |
Utan GROUP BY kommer COUNT helt enkelt att returnera ett totalt antal rader:
SELECT Count(*) Number_of_Westerosians
FROM Westerosians
avkastning ...
Number_of_Westerosians |
---|
6 |
Men genom att lägga till GROUP BY kan vi COUNT användarna för varje värde i en given kolumn för att returnera antalet personer i ett visst Great House, säga:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
avkastning ...
Hus | Number_of_Westerosians |
---|---|
Stark | 3 |
Greyjoy | 1 |
Lannister | 2 |
Det är vanligt att kombinera GROUP BY med ORDER BY för att sortera resultat efter största eller minsta kategori:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc
avkastning ...
Hus | Number_of_Westerosians |
---|---|
Stark | 3 |
Lannister | 2 |
Greyjoy | 1 |
Filtrera GROUP BY-resultat med hjälp av en HAVING-klausul
En HAVING-klausul filtrerar resultaten av ett GROUP BY-uttryck. Obs: Följande exempel använder bibliotekets exempeldatabas.
Exempel:
Returnera alla författare som skrev mer än en bok ( levande exempel ).
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
;
Returnera alla böcker som har mer än tre författare ( levande exempel ).
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
;
Grundläggande GRUPP AV exempel
Det kan vara lättare om du tänker på GROUP BY som "för varje" för att förklara. Frågan nedan:
SELECT EmpID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
säger:
"Ge mig summan av månadssalarier för varje EmpID"
Så om ditt bord såg ut så här:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Resultat:
+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
Summa verkar inte göra något eftersom summan av ett nummer är det numret. Å andra sidan om det såg ut så här:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|1 |300 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Resultat:
+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
Sedan skulle det bero på att det finns två EmpID 1: er att summera tillsammans.
ROLAP-aggregering (Data Mining)
Beskrivning
SQL-standarden ger ytterligare två aggregerade operatörer. Dessa använder det polymorfa värdet "ALL" för att beteckna uppsättningen av alla värden som ett attribut kan ta. De två operatörerna är:
-
with data cube
att den ger alla möjliga kombinationer än klausulens attribut för klausulen. -
with roll up
att det ger de aggregerade erhållna genom att beakta attributen i ordning från vänster till höger jämfört med hur de är listade i klausulens argument.
SQL-standardversioner som stöder dessa funktioner: 1999,2003,2006,2008,2011.
exempel
Tänk på denna tabell:
Mat | varumärke | Totala summan |
---|---|---|
Pasta | Märke1 | 100 |
Pasta | Märke2 | 250 |
Pizza | Märke2 | 300 |
Med kub
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
Mat | varumärke | Totala summan |
---|---|---|
Pasta | Märke1 | 100 |
Pasta | Märke2 | 250 |
Pasta | ALLT | 350 |
Pizza | Märke2 | 300 |
Pizza | ALLT | 300 |
ALLT | Märke1 | 100 |
ALLT | Märke2 | 550 |
ALLT | ALLT | 650 |
Med rulla upp
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
Mat | varumärke | Totala summan |
---|---|---|
Pasta | Märke1 | 100 |
Pasta | Märke2 | 250 |
Pizza | Märke2 | 300 |
Pasta | ALLT | 350 |
Pizza | ALLT | 300 |
ALLT | ALLT | 650 |