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 cubeatt den ger alla möjliga kombinationer än klausulens attribut för klausulen. -
with roll upatt 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 |