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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow