Szukaj…
Wprowadzenie
Wyniki zapytania SELECT można pogrupować według jednej lub więcej kolumn za pomocą instrukcji GROUP BY
: wszystkie wyniki o tej samej wartości w zgrupowanych kolumnach są agregowane razem. To generuje tabelę wyników częściowych zamiast jednego wyniku. GROUP BY może być używane w połączeniu z funkcjami agregacji za pomocą instrukcji HAVING
celu zdefiniowania sposobu agregowania kolumn niezgrupowanych.
Składnia
GRUPUJ WEDŁUG {
wyrażenie kolumnowe
| ROLLUP (<grupa_wyrażenie> [, ... n])
| CUBE (<grupa_wyrażenie> [, ... n])
| GRUPY ZESTAWÓW ([, ... n])
| () - oblicza sumę całkowitą
} [, ... n]<grupa_wyrażenie> :: =
wyrażenie kolumnowe
| (wyrażenie kolumny [, ... n])<zestaw_grupowy> :: =
() - oblicza sumę całkowitą
| <zestaw_grupowy_grupowania>
| (<element_grupowy_grupowania> [, ... n])<zestaw_grupowy_grup> :: =
<grupa_wyrażenie>
| ROLLUP (<grupa_wyrażenie> [, ... n])
| CUBE (<grupa_wyrażenie> [, ... n])
UŻYJ GRUPY WED, ABY LICZYĆ liczbę wierszy dla każdego unikalnego wpisu w danej kolumnie
Załóżmy, że chcesz wygenerować liczby lub sumy częściowe dla danej wartości w kolumnie.
Biorąc pod uwagę tę tabelę, „Westerosians”:
Nazwa | GreatHouseAllegience |
---|---|
Arya | Sztywny |
Cercei | Lannister |
Myrcella | Lannister |
Yara | Greyjoy |
Catelyn | Sztywny |
Sansa | Sztywny |
Bez GROUP BY, COUNT zwróci po prostu całkowitą liczbę wierszy:
SELECT Count(*) Number_of_Westerosians
FROM Westerosians
zwroty...
Number_of_Westerosians |
---|
6 |
Ale dodając GROUP BY, możemy Liczyć użytkowników dla każdej wartości w danej kolumnie, aby zwrócić liczbę osób w danym Wielkim Domu, powiedzmy:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
zwroty...
Dom | Number_of_Westerosians |
---|---|
Sztywny | 3) |
Greyjoy | 1 |
Lannister | 2) |
Często łączy się GROUP BY z ORDER BY, aby sortować wyniki według największej lub najmniejszej kategorii:
SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians
FROM Westerosians
GROUP BY GreatHouseAllegience
ORDER BY Number_of_Westerosians Desc
zwroty...
Dom | Number_of_Westerosians |
---|---|
Sztywny | 3) |
Lannister | 2) |
Greyjoy | 1 |
Filtruj wyniki GROUP BY za pomocą klauzuli HAVING
Klauzula HAVING filtruje wyniki wyrażenia GROUP BY. Uwaga: Poniższe przykłady wykorzystują przykładową bazę danych Biblioteki .
Przykłady:
Zwróć wszystkich autorów, którzy napisali więcej niż jedną książkę ( przykład na żywo ).
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
;
Zwróć wszystkie książki, które mają więcej niż trzech autorów ( przykład na żywo ).
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
;
Przykład grupy podstawowej według
Może być łatwiej, jeśli dla wyjaśnienia uważasz GROUP BY za „dla każdego”. Zapytanie poniżej:
SELECT EmpID, SUM (MonthlySalary)
FROM Employee
GROUP BY EmpID
mówi:
„Daj mi sumę miesięcznego wynagrodzenia dla każdego EmpID”
Więc jeśli twój stół wyglądał tak:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Wynik:
+-+---+
|1|200|
+-+---+
|2|300|
+-+---+
Wydaje się, że suma nic nie robi, ponieważ suma jednej liczby jest tą liczbą. Z drugiej strony, jeśli wyglądało to tak:
+-----+-------------+
|EmpID|MonthlySalary|
+-----+-------------+
|1 |200 |
+-----+-------------+
|1 |300 |
+-----+-------------+
|2 |300 |
+-----+-------------+
Wynik:
+-+---+
|1|500|
+-+---+
|2|300|
+-+---+
Tak by było, ponieważ są dwa sumy EmpID 1 do zsumowania.
Agregacja ROLAP (Data Mining)
Opis
Standard SQL udostępnia dwa dodatkowe operatory agregujące. Wykorzystują one wartość polimorficzną „ALL” do oznaczenia zestawu wszystkich wartości, które może przyjąć atrybut. Dwaj operatorzy to:
-
with data cube
która zapewnia wszystkie możliwe kombinacje niż atrybuty argumentu klauzuli. -
with roll up
zapewnia agregacje uzyskane przez rozważenie atrybutów w kolejności od lewej do prawej w porównaniu z tym, jak są one wymienione w argumencie klauzuli.
Standardowe wersje SQL obsługujące te funkcje: 1999,2003,2006,2008,2011.
Przykłady
Rozważ tę tabelę:
jedzenie | Marka | Łączna kwota |
---|---|---|
Makaron | Marka 1 | 100 |
Makaron | Brand2 | 250 |
Pizza | Brand2 | 300 |
Z kostką
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with cube
jedzenie | Marka | Łączna kwota |
---|---|---|
Makaron | Marka 1 | 100 |
Makaron | Brand2 | 250 |
Makaron | WSZYSTKO | 350 |
Pizza | Brand2 | 300 |
Pizza | WSZYSTKO | 300 |
WSZYSTKO | Marka 1 | 100 |
WSZYSTKO | Brand2 | 550 |
WSZYSTKO | WSZYSTKO | 650 |
Z rolką
select Food,Brand,Total_amount
from Table
group by Food,Brand,Total_amount with roll up
jedzenie | Marka | Łączna kwota |
---|---|---|
Makaron | Marka 1 | 100 |
Makaron | Brand2 | 250 |
Pizza | Brand2 | 300 |
Makaron | WSZYSTKO | 350 |
Pizza | WSZYSTKO | 300 |
WSZYSTKO | WSZYSTKO | 650 |