Komputery Okna Internet

Zapytania SQL grupują według. Grupowanie danych języka Transact-SQL GROUP BY. Grupowanie za pomocą grupowania według i filtrowania grup za pomocą posiadania

Grupowanie danych pozwala na podzielenie wszystkich danych na logiczne zbiory, dzięki czemu możliwe jest wykonanie obliczeń statystycznych oddzielnie w każdej grupie.

1. Tworzenie grup (GROUP BY)

Grupy tworzone są na podstawie propozycji GRUPUJ WEDŁUG operator WYBIERAĆ. Spójrzmy na przykład.

WYBIERAĆ Produkt, SUM(ilość) AS Numer_produktu Z GRUPY Sumproduct WEDŁUG produktu

W ramach tej prośby pozyskaliśmy informacje o liczbie produktów sprzedanych w każdym miesiącu. Operator WYBIERAĆ nakazuje wyświetlenie dwóch kolumn Produkt- nazwa produktu i Numer_produktu- pole kalkulacyjne, które utworzyliśmy w celu wyświetlenia ilości sprzedanych produktów (formuła pola SUM (Ilość)). Oferta GRUPUJ WEDŁUG mówi systemowi DBMS, aby pogrupował dane według kolumn Produkt. Warto to również zauważyć GRUPUJ WEDŁUG powinno nastąpić po zdaniu GDZIE a wcześniej ZAMÓW PRZEZ.

2. Grupy filtrów (HAVING)

Podobnie jak filtrowaliśmy wiersze w tabeli, możemy filtrować według pogrupowanych danych. Aby to zrobić w SQL-a jest operator MAJĄCY. Weźmy poprzedni przykład i dodajmy filtrowanie według grup.

WYBIERAĆ Produkt, SUM(ilość) AS Numer_produktu Z Sumproduct GRUPA WEDŁUG Produktu O SUMIE(ilość)>4000

Widzimy, że po obliczeniu ilości sprzedanych towarów dla każdego produktu, DBMS „odciął” te produkty, których sprzedano mniej niż 4000 sztuk.

Jak widzimy, operator MAJĄCY bardzo podobny do operatora GDZIE jednak mają między sobą znaczącą różnicę: GDZIE filtruje dane przed ich grupowaniem, oraz MAJĄCY- wykonuje filtrowanie po grupowaniu. Zatem linie usunięte we wniosku GDZIE NIE zostanie uwzględniony w grupie. A więc operatorzy GDZIE I MAJĄCY można użyć w tym samym zdaniu. Spójrzmy na przykład:

WYBIERAĆ Produkt, SUM(ilość) AS Numer_produktu Z Sumprodukt WHERE Produkt<>„Narty długie” GRUPUJ WG produktu O SUMIE (ilość)> 4000

Dodaliśmy operator do poprzedniego przykładu GDZIE gdzie produkt został wskazany Narty długie, co z kolei wpłynęło na grupowanie przez operatora MAJĄCY. W rezultacie widzimy, że produkt Narty długie nie została ujęta w wykazie grup, w których liczba sprzedanych produktów przekraczała 4000 szt.

3. Grupowanie i sortowanie

Podobnie jak w przypadku normalnego wyszukiwania danych, grupy możemy sortować po zgrupowaniu z operatorem MAJĄCY. Możemy w tym celu posłużyć się operatorem, który już znamy ZAMÓW PRZEZ. W tej sytuacji jego zastosowanie jest podobne do poprzednich przykładów. Np:

WYBIERAĆ Produkt, SUM(ilość) AS Product_num Z Sumproduct GRUPA WG produktu O SUM(ilość)>3000 ZAMÓW PRZEZ SUMĘ(ilość)

lub po prostu wskaż numer pola w kolejności, według której chcemy sortować:

WYBIERAĆ Produkt, SUMA(ilość) AS Numer_produktu Z Sumproduct GRUPA WEDŁUG produktu O SUMIE(ilość)>3000 ZAMÓW PRZEZ 2

Widzimy, że aby posortować wyniki podsumowania, wystarczy napisać zdania ZAMÓW PRZEZ po operatorze MAJĄCY. Jednakże jest jedno zastrzeżenie. Uzyskaj dostęp do DBMS nie obsługuje sortowania grup po aliasach kolumn, czyli w naszym przykładzie w celu posortowania wartości nie będziemy mogli napisać na końcu żądania ZAMÓW WEDŁUG NUMERU PRODUKTU.

W tym artykule opowiem jak grupuje się dane, jak poprawnie używać grupowania według i posiadania wewnątrz zapytań SQL na przykładzie kilku zapytań.

Większość informacji w bazach danych przechowywana jest w formie szczegółowej. Często jednak istnieje potrzeba uzyskania raportów. Dowiedz się na przykład o całkowitej liczbie komentarzy użytkowników lub być może o ilości towarów w magazynach. Podobnych zadań jest mnóstwo. Dlatego język SQL specjalnie przewiduje w takich przypadkach grupowanie według i posiadanie konstrukcji, które pozwalają odpowiednio grupować i filtrować powstałe grupy danych.

Jednak ich użycie sprawia wiele problemów początkującym twórcom oprogramowania. Nie do końca poprawnie interpretują uzyskane wyniki i sam mechanizm grupowania danych. Dlatego zastanówmy się w praktyce, co się dzieje i jak.

W ramach przykładu rozważę tylko jedną tabelę. Powód jest prosty, operatory te są już zastosowane do wynikowej próbki danych (po połączeniu wierszy tabeli i ich przefiltrowaniu). Zatem dodanie operatorów Where i Join nie zmieni istoty.

Wyobraźmy sobie abstrakcyjny przykład. Załóżmy, że masz tabelę podsumowującą użytkowników forum. Nazwijmy to userstat i wygląda to tak. Ważna kwestia, uważamy, że użytkownik może należeć tylko do jednej grupy.

nazwa_użytkownika - nazwa użytkownika

forum_group - nazwa grupy

mess_count - liczba wiadomości

is_have_social_profile - czy profil forum zawiera link do strony w serwisie społecznościowym

Jak widać tabela jest prosta i wiele rzeczy można obliczyć samodzielnie za pomocą kalkulatora. To jednak tylko przykład i jest tylko 10 wpisów. W prawdziwych bazach danych rekordy można mierzyć w tysiącach. Zacznijmy więc od zapytań.

Czyste grupowanie za pomocą grupowania według

Wyobraźmy sobie, że musimy znać wartość każdej grupy, czyli średnią ocenę użytkowników w grupie i całkowitą liczbę wiadomości pozostawionych na forum.

Najpierw krótki opis słowny, ułatwiający zrozumienie zapytania SQL. Musisz więc znaleźć obliczone wartości według grup forum. W związku z tym musisz podzielić wszystkie te dziesięć linii na trzy różne grupy: administrator, moder, użytkownik. W tym celu należy na końcu żądania dodać grupowanie według wartości pola forum_group. Dodaj także wyrażenia obliczone, aby wybrać za pomocą tak zwanych funkcji agregujących.

Określ pola i kolumny obliczeniowe wybierz forum_group, avg(raiting) jako avg_raiting, sum(mess_count) jako total_mess_count -- Określ tabelę z userstat -- Określ grupowanie według grupy pól według forum_group

Należy pamiętać, że po użyciu w zapytaniu konstrukcji group by można używać tylko tych pól w selekcji, które zostały określone po group by, bez korzystania z funkcji agregujących. Pozostałe pola należy określić wewnątrz funkcji agregujących.

Użyłem także dwóch funkcji agregujących. AVG - oblicza średnią wartość. I SUM - oblicza sumę.

grupa_forumśrednia_ocenacałkowita_liczba_messów
Admin 4 50
moder 3 50
użytkownik 3 150

1. Najpierw wszystkie wiersze tabeli źródłowej podzielono na trzy grupy według wartości pola forum_group. Na przykład w grupie administratorów było trzech użytkowników. Wewnątrz modera znajdują się również 3 linie. A wewnątrz grupy użytkowników były 4 linie (czterech użytkowników).

2. Następnie do każdej grupy zastosowano funkcje agregujące. Przykładowo dla grupy admin średnia ocena została obliczona w następujący sposób (2 + 5 + 5)/3 = 4. Liczbę wiadomości obliczono jako (10 + 15 + 25) = 50.

Jak widać nic skomplikowanego. Zastosowaliśmy jednak tylko jeden warunek grupowania i nie filtrowaliśmy według grup. Przejdźmy zatem do następnego przykładu.

Grupowanie za pomocą grupowania według i filtrowania grup za pomocą posiadania

Przyjrzyjmy się teraz bardziej złożonemu przykładowi grupowania danych. Załóżmy, że musimy ocenić skuteczność działań mających na celu przyciągnięcie użytkowników do działań społecznościowych. Mówiąc najprościej, dowiedz się, ilu użytkowników w grupach pozostawiło linki do swoich profili, a ile zignorowanych mailingów itp. Jednak w prawdziwym życiu takich grup może być wiele, dlatego trzeba odfiltrować te grupy, które można pominąć (np. zbyt mało osób nie zostawiło linku; po co zaśmiecać pełny raport). W moim przykładzie są to grupy składające się tylko z jednego użytkownika.

Najpierw opiszemy słownie, co należy zrobić w zapytaniu SQL. Musimy podzielić wszystkie wiersze oryginalnej tabeli userstat według następujących kryteriów: nazwa grupy i obecność profilu społecznościowego. W związku z tym konieczne jest pogrupowanie danych tabeli według pól forum_group i is_have_social_profile. Nie interesują nas jednak te grupy, w których jest tylko jedna osoba. Dlatego takie grupy należy odfiltrować.

Notatka: Warto wiedzieć, że problem ten można rozwiązać grupując tylko według jednego pola. Jeśli użyjesz konstrukcji case. Jednakże w ramach tego przykładu pokazane są możliwości grupowania.

Chciałbym też od razu wyjaśnić jedną ważną kwestię. Podczas korzystania z funkcji agregujących możesz filtrować tylko za pomocą Have, a nie według poszczególnych pól. Innymi słowy, nie jest to konstrukcja „where”, jest to filtr grup wierszy, a nie pojedynczych rekordów. Chociaż warunki wewnątrz są określone w podobny sposób za pomocą „lub” i „i”.

Tak będzie wyglądać zapytanie SQL

Określ pola i kolumny obliczeniowe wybierz forum_group, is_have_social_profile, count(*) jako sumę -- Określ tabelę z userstat -- Określ grupowanie według grupy pól według forum_group, is_have_social_profile -- Określ filtr grupowy mający count(*) > 1

Należy pamiętać, że pola po grupie według konstrukcji są oddzielone przecinkami. Określanie pól w selekcji odbywa się analogicznie jak w poprzednim przykładzie. Użyłem także funkcji agregującej count, która oblicza liczbę wierszy w grupach.

Oto wynik:

grupa_forumis_have_social_profilecałkowity
Admin 1 2
moder 1 2
użytkownik 0 3

Przyjrzyjmy się krok po kroku, jak wyszedł ten wynik.

1. Początkowo uzyskano 6 grup. Każda z grup forum_group została podzielona na dwie podgrupy w oparciu o wartości pola is_have_social_profile. Innymi słowy, grupy: , , , , , .

Notatka: Nawiasem mówiąc, grup niekoniecznie byłoby 6. Na przykład, gdyby wszyscy administratorzy wypełnili profil, byłoby 5 grup, ponieważ pole is_have_social_profile miałoby tylko jedną wartość dla użytkowników grupy admin.

2. Następnie do każdej grupy zastosowano warunek filtrowania. W związku z tym wykluczono następujące grupy: , , . Ponieważ w każdej takiej grupie znajdował się tylko jeden wiersz tabeli źródłowej.

3. Następnie obliczono niezbędne dane i uzyskano wynik.

Jak widać, nie ma nic trudnego w użyciu.

Warto wiedzieć, że w zależności od bazy danych możliwości tych konstrukcji mogą się różnić. Na przykład może istnieć więcej funkcji agregujących lub można określić kolumny obliczeniowe zamiast pojedynczych pól w ramach grupowania. Informacje te należy uwzględnić już w specyfikacji.

Teraz wiesz, jak grupować dane metodą grupowania według, a także jak filtrować grupy za pomocą funkcji „posiadanie”.


Ostatnia aktualizacja: 19.07.2017

T-SQL używa instrukcji GROUP BY i HAVING do grupowania danych, używając następującej formalnej składni:

WYBIERZ kolumny Z tabeli

GRUPUJ WEDŁUG

Klauzula GROUP BY określa sposób grupowania wierszy.

Na przykład pogrupujmy produkty według producenta

WYBIERZ producenta, COUNT(*) AS ModeleLiczba z grupy produktów WEDŁUG producenta

Pierwsza kolumna w instrukcji SELECT - Producent reprezentuje nazwę grupy, a druga kolumna - ModelsCount reprezentuje wynik funkcji Count, która oblicza liczbę wierszy w grupie.

Warto wziąć pod uwagę, że każda kolumna używana w instrukcji SELECT (nie licząc kolumn przechowujących wynik funkcji agregujących) musi być podana po klauzuli GROUP BY. Na przykład w powyższym przypadku kolumna Producent jest określona zarówno w klauzulach SELECT, jak i GROUP BY.

A jeśli instrukcja SELECT wybiera jedną lub więcej kolumn, a także używa funkcji agregujących, wówczas musisz użyć klauzuli GROUP BY. Dlatego poniższy przykład nie będzie działać, ponieważ nie zawiera wyrażenia grupującego:

WYBIERZ producenta, COUNT(*) AS ModeleLicz z produktów

Inny przykład, dodajmy grupowanie według liczby produktów:

WYBIERZ producenta, liczbę produktów, COUNT(*) AS Liczba modeli Z GRUPY PRODUKTÓW WG producenta, liczbę produktów

Klauzula GROUP BY może grupować według wielu kolumn.

Jeśli kolumna, według której grupujesz, zawiera wartość NULL, wiersze z wartością NULL utworzą osobną grupę.

Należy pamiętać, że klauzula GROUP BY musi nastąpić po klauzuli WHERE, ale przed klauzulą ​​ORDER BY:

WYBIERZ producenta, COUNT(*) AS ModeleLicz z produktów GDZIE Cena > 30000 GRUPA WG producenta ZAMÓW WG modeliIlość DESC

Filtrowanie grupowe. MAJĄCY

Operator MAJĄCY określa, które grupy zostaną uwzględnione w wyniku wyjściowym, czyli filtruje grupy.

Użycie HAVING jest pod wieloma względami podobne do użycia WHERE. Do filtrowania wierszy służy tylko WHERE, do filtrowania grup służy HAVING.

Na przykład znajdźmy wszystkie grupy produktów według producenta, dla którego zdefiniowano więcej niż 1 model:

WYBIERZ producenta, COUNT(*) AS ModeleLicz z grupy produktów WEDŁUG producenta HAVING COUNT(*) > 1

W tym przypadku w jednym poleceniu możemy użyć wyrażeń WHERE i HAVING:

WYBIERZ producenta, COUNT(*) AS ModeleLicz z produktów GDZIE Cena * Liczba produktów > 80000 GRUPA WG producenta HAVING COUNT(*) > 1

Oznacza to, że w tym przypadku wiersze są najpierw filtrowane: wybierane są te produkty, których łączny koszt przekracza 80 000. Następnie wybrane produkty są grupowane według producentów. Następnie filtrowane są same grupy - wybierane są te grupy, które zawierają więcej niż 1 model.

Jeśli konieczne jest sortowanie, po wyrażeniu HAVING następuje wyrażenie ORDER BY:

WYBIERZ producenta, COUNT(*) AS Modele, SUM(ProductCount) AS Jednostki OD Produkty GDZIE Cena * ProductCount > 80000 GRUPA WG producenta HAVING SUM(ProductCount) > 2 ZAMÓW WG jednostek DESC

W tym przypadku grupowanie odbywa się według producenta i wybierana jest również liczba modeli dla każdego producenta (Modele) oraz całkowita liczba wszystkich produktów dla wszystkich tych modeli (Jednostki). Na koniec grupy sortowane są malejąco według liczby produktów.

W tym samouczku dowiesz się, jak używać instrukcji SQL GRUPUJ WEDŁUG ze składnią i przykładami.

Opis

Klauzuli SQL GROUP BY można użyć w instrukcji SELECT do gromadzenia danych z wielu rekordów i grupowania wyników w jedną lub więcej kolumn.

Składnia

Składnia instrukcji GROUP BY w języku SQL jest następująca:

Parametry lub argumenty

wyrażenie1 , wyrażenie2 , … wyrażenie_n Wyrażenia, które nie są zawarte w funkcji agregującej i muszą być zawarte w GROUP BY na końcu zapytania SQL. funkcja_agregacyjna Jest to funkcja agregująca, taka jak SUM, COUNT, MIN, MAX lub AVG. wyrażenie_zagregowane Jest to kolumna lub wyrażenie, dla którego zostanie użyta funkcja_zagregowana. tabele Tabele, z których chcesz pobrać rekordy. Klauzula FROM musi określać co najmniej jedną tabelę. GDZIE warunki Opcjonalne. Są to warunki, które należy spełnić, aby wybrać rekordy. ORDER BY wyrażenie Opcjonalne. Wyrażenie używane do sortowania rekordów w zestawie wyników. Jeśli określono więcej niż jedno wyrażenie, wartości należy oddzielić przecinkami. ASC Opcjonalnie. ASC sortuje zestaw wyników w kolejności rosnącej według wyrażenia. Jest to zachowanie domyślne, jeśli nie określono żadnego modyfikatora. DESC Opcjonalnie. DESC sortuje zestaw wyników w kolejności malejącej według wyrażenia.

Przykład — użycie GROUP BY z funkcją SUMA

Zobaczmy, jak używać GROUP BY z funkcją SUMA w SQL.
W tym przykładzie mamy tabelę pracowników zawierającą następujące dane:

id_działu suma_wynagrodzeń
500 119500
501 113000

W tym przykładzie użyliśmy funkcji SUM, aby zsumować wszystkie pensje dla każdego dept_id i nadaliśmy wynikowi SUM(salary) alias „total_salaries”. Ponieważ dept_id nie jest zawarty w funkcji SUM, należy go określić w klauzuli GROUP BY.

Przykład — użycie GROUP BY z funkcją COUNT

Zobaczmy, jak używać klauzuli GROUP BY z funkcją COUNT w SQL.

W tym przykładzie mamy tabelę produktów zawierającą następujące dane:

W tym przykładzie użyliśmy funkcji COUNT do obliczenia liczby produktów ogółem dla każdego identyfikatora kategorii i określiliśmy alias „produkty ogółem” jako wynik funkcji COUNT. Wykluczyliśmy wszystkie wartości id kategorii, które mają wartość NULL, filtrując je w klauzuli WHERE. Ponieważ id kategorii nie jest zawarty w funkcji COUNT, należy go określić w klauzuli GROUP BY.

Przykład — użycie GROUP BY z funkcją MIN

Zobaczmy teraz, jak używać klauzuli GROUP BY z funkcją MIN w SQL.

W tym przykładzie ponownie skorzystamy z tabeli pracowników z następującymi danymi:

Wybrane zostaną 2 wpisy. Oto wyniki, które otrzymasz:

id_działu najniższa_płaca
500 57500
501 42000

W tym przykładzie użyliśmy funkcji MIN, aby zwrócić najniższą wartość wynagrodzenia dla każdego dept_id, a wynikom funkcji MIN nadaliśmy alias „najniższe_zarobki”. Ponieważ dept_id nie jest zawarty w funkcji MIN, należy go określić w klauzuli GROUP BY.

Przykład - użycie GROUP BY z funkcją MAX

Na koniec przyjrzyjmy się, jak używać klauzuli GROUP BY z funkcją MAX.

Skorzystajmy ponownie z tabeli pracowników, ale tym razem znajdź najwyższe wynagrodzenie dla każdego dept_id:

numer_pracownika imię nazwisko wynagrodzenie id_działu
1001 Justin Biebera 62000 500
1002 Selena Gomeza 57500 500
1003 Mila Kunisa 71000 501
1004 Tomek Rejs 42000 501

Wprowadź następującą instrukcję SQL.

Nazwisko

Rok urodzenia

Iwanowicz

Pietrowicz

Michajłowicz

Borysowicz

Nikołajewna

Sidorowa

Katarzyna

Iwanowna

Cicha sympatia

Siergiejewicz

Anatolij

Michajłowicz

Ryż. 4.20. Używanie LIKE „^[D-M]%”

Można teraz tworzyć predykaty w oparciu o specjalnie zdefiniowane relacje SQL. Możesz wyszukiwać wartości w określonym zakresie (BETWEEN) lub zestawie liczbowym (IN), lub możesz wyszukiwać wartości znakowe pasujące do tekstu w ramach parametrów (LIKE).

4.4. Funkcje agregujące GROUP BY i SQL

Wynikiem zapytania może być uogólniona wartość grupy pól, podobnie jak wartość pojedynczego pola. Odbywa się to za pomocą standardowych funkcji agregujących SQL, które są wymienione poniżej:

Z wyjątkiem specjalnego przypadku COUNT(*), każda z tych funkcji działa na zbiorze wartości w kolumnie jakiejś tabeli i generuje tylko jedną wartość.

Argument wszystkich funkcji oprócz COUNT(*) może być poprzedzony słowem kluczowym DISTINCT, wskazującym, że zduplikowane wartości kolumn

należy wykluczyć, zanim będzie można zastosować funkcję. Funkcja specjalna COUNT(*) służy do zliczania wszystkich wierszy tabeli bez wyjątku (w tym duplikatów).

Funkcje agregujące są używane podobnie do nazw pól w klauzuli zapytania SELECT, z jednym wyjątkiem: przyjmują nazwy pól jako argumenty. W przypadku SUM i AVG można używać wyłącznie pól numerycznych.

Z parametrami COUNT, MAX i MIN można używać zarówno pól numerycznych, jak i znakowych. W przypadku użycia z polami znakowymi MAX i MIN przetłumaczą je na odpowiednik kodu ASCII, co powinno poinformować, że MIN będzie oznaczać pierwszą, a MAX ostatnią wartość w kolejności alfabetycznej.

Aby znaleźć SUMĘ wszystkich wynagrodzeń w tabeli DEPARTMENT_EMPLOYEE (ryc. 2.3), należy wprowadzić następujące zapytanie:

Z Działu_ Pracownicy;

A na ekranie zobaczymy wynik: 46800 (tabela będzie miała jedną kolumnę o nazwie SUM).

Obliczenie średniej wartości wynagrodzenia jest również proste:

WYBIERZ ŚREDNĄ ((wynagrodzenie))

Z Działu_ Pracownicy;

Funkcja COUNT różni się nieco od pozostałych. Zlicza liczbę wartości w danej kolumnie lub liczbę wierszy w tabeli. Kiedy zlicza wartości kolumny, stosuje się go wraz z DISTINCT w celu zliczenia liczby unikalnych wartości w danym polu.

Tabela zawiera osiem wierszy zawierających różne wartości wynagrodzeń.

Należy pamiętać, że w trzech ostatnich przykładach uwzględniono także informacje o zwolnionych pracownikach.

Poniższe zdanie pozwala określić liczbę podziałów na

DISTINCT, po którym następuje nazwa pola, do którego się odnosi, ujęta w nawiasy, z COUNT zastosowanym do poszczególnych kolumn.

WYBIERZ LICZBĘ (*)

Z Działu_ Pracownicy;

Odpowiedź będzie brzmiała:

COUNT(*) zlicza każdy wiersz w tabeli.

DISTINCT nie ma zastosowania w przypadku COUNT (*).

Załóżmy, że w tabeli PAYMENT_STATE (rys. 2.4) znajduje się jeszcze jedna kolumna przechowująca kwotę dokonanych potrąceń (pole Deduction) dla każdej linii wyciągu. Następnie, jeśli interesuje Cię cała kwota, to zawartość kolumn Kwota i Potrącenie należy zsumować.

Jeżeli interesuje Cię maksymalna kwota, z uwzględnieniem potrąceń, zawarta w wyciągu, to możesz tego dokonać korzystając ze zdania:

WYBIERZ MAX (suma + odliczenie)

Z arkusza płac;

Dla każdego wiersza tabeli to zapytanie doda wartość pola Kwota do wartości pola Odliczenie i wybierze największą znalezioną wartość.

GRUPUJ WEDŁUG KLAUZULI (przegrupowanie, kolejność)

Klauzula GROUP BY umożliwia zdefiniowanie podzbioru wartości w danym polu w odniesieniu do innego pola i zastosowanie do tego podzbioru funkcji agregującej. Umożliwia to łączenie pól i funkcji agregujących w jednej klauzuli SELECT.

Załóżmy na przykład, że chcesz określić, ilu pracowników znajduje się w każdym dziale (odpowiedź pokazano na rysunku 4.21):

SELECT Department_ID, COUNT (DISTINCT Department_ID) AS Liczba_pracowników

Dział_ Pracownicy

Data zwolnienia

Liczba pracowników

Klauzula GROUP BY pozostawia tylko unikalne wartości kolumn, domyślnie posortowane w kolejności rosnącej. Pod tym względem klauzula GROUP BY różni się od klauzuli ORDER BY tym, że ta ostatnia, choć sortuje rekordy w kolejności rosnącej, nie usuwa zduplikowanych wartości. W podanym przykładzie zapytanie grupuje wiersze tabeli według wartości kolumny Dept_ID (według numerów działów). Wiersze o tych samych numerach działów są najpierw łączone w grupy, ale dla każdej grupy wyświetlany jest tylko jeden wiersz. Druga kolumna wyświetla liczbę wierszy w każdej grupie, tj. liczbę pracowników w każdym dziale.

Wartość pola, do którego zastosowano GROUP BY, z definicji ma tylko jedną wartość na grupę wyników, tak jak ma to miejsce w przypadku funkcji agregującej. Rezultatem jest kompatybilność, która umożliwia łączenie agregatów i pól w ten sposób.

Niech na przykład tabela PAYMENT_LIST będzie wyglądać jak na rys. 4.22 i chcemy określić maksymalną kwotę wypłacaną na liście płac każdemu pracownikowi.

Rodzaj płatności

W rezultacie otrzymujemy.

Ryż. 4.23. Funkcja agregująca z AS

Grupowanie może odbywać się według kilku atrybutów:

Z Arkusza 1

GRUPA WG Identyfikatora_pracownika, Data;

Wynik:

Ryż. 4.24. Grupowanie według wielu atrybutów

Jeśli zajdzie potrzeba ograniczenia liczby grup uzyskanych po GROUP BY, można to zaimplementować za pomocą klauzuli HAVING.

4,5. Używanie wyrażenia MIEĆ

Klauzula HAVING pełni w przypadku grup tę samą rolę, co klauzula WHERE w przypadku wierszy: służy do wykluczania grup w taki sam sposób, w jaki WHERE służy do wykluczania wierszy. To wyrażenie jest zawarte w zdaniu

tylko wtedy, gdy istnieje klauzula GROUP BY, a wyrażenie w HAVING musi przyjmować jedną wartość dla grupy.

Załóżmy na przykład, że musimy pokazać skład ilościowy wszystkich działów (ryc. 2.3), z wyłączeniem działu nr 3.

SELECT Department_ID, COUNT (DISTINCT Department_ID) AS Liczba _pracowników

Dział_ Pracownicy

Data zwolnienia

POSIADAJĄC ID_Dział< > 3;

Liczba pracowników

Ostatnim elementem podczas oceny wyrażenia tabelowego jest sekcja HAVING (jeśli występuje). Składnia tej sekcji jest następująca:

::=

MAJĄCY

Warunek wyszukiwania w tej sekcji określa warunek dla grupy wierszy w pogrupowanej tabeli. Formalnie sekcja HAVING może występować także w wyrażeniu tabelowym niezawierającym GROUP BY. W tym przypadku za wynik obliczeń poprzednich podziałów przyjmuje się zgrupowaną tabelę składającą się z pojedynczej grupy bez dedykowanych kolumn grupujących.

Warunek wyszukiwania klauzuli HAVING podlega tym samym regułom składniowym, co warunek wyszukiwania klauzuli WHERE i może zawierać te same predykaty.

Istnieją jednak specjalne ograniczenia syntaktyczne dotyczące użycia w warunku wyszukiwania specyfikacji kolumn tabeli z klauzuli FROM danego wyrażenia tabelowego. Ograniczenia te wynikają z faktu, że warunek wyszukiwania sekcji HAVING ustawia warunek dla całej grupy, a nie dla poszczególnych wierszy.

Dlatego też w wyrażeniach arytmetycznych predykatów zawartych w klauzuli wyboru klauzuli HAVING można bezpośrednio używać wyłącznie specyfikacji kolumn określonych jako kolumny grupujące w klauzuli GROUP BY. Pozostałe kolumny można określić jedynie w ramach specyfikacji funkcji agregujących COUNT, SUM, AVG, MIN i MAX, które w tym przypadku wyliczają jakąś wartość zagregowaną dla całej grupy wierszy. Podobnie jest z podzapytaniami zawartymi w predykatach warunku selekcji sekcji HAVING: jeżeli podzapytanie wykorzystuje cechę aktualnej grupy, to można ją określić jedynie poprzez odwołanie się do kolumn grupujących.

Niech zapytanie będzie miało postać (tabela bazowa patrz rys. 4.22):

SELECT identyfikator_pracownika, data, MAX ((kwota))

Z Arkusza 1

GRUPA WG Identyfikatora_pracownika, Data;

należy doprecyzować, aby wykazywane były jedynie płatności przekraczające 1000.

Jednak standardowo niedozwolone jest używanie funkcji agregującej w klauzuli WHERE (chyba że użyjesz podzapytania, co opisano później), ponieważ predykaty są oceniane w kategoriach pojedynczego wiersza, a funkcje agregujące są oceniane w kategoriach grupy wierszy .

Poniższe zdanie byłoby nieprawidłowe:

WYBIERZ Id_id, datę, MAX (kwota)

Z Arkusza 1

GDZIE MAX ((Suma)) > 1000 GRUPA WG Comp_Id, Data;

Prawidłowe zdanie brzmiałoby:

SELECT identyfikator_pracownika, data, MAX ((kwota))