Počítače Windows Internet

Dopyty SQL zoskupiť podľa. Zoskupenie údajov Transact-SQL GROUP BY. Zoskupovanie pomocou group by a filtrovanie skupín pomocou has

Zoskupovanie údajov vám umožňuje rozdeliť všetky údaje do logických množín, čo umožňuje vykonávať štatistické výpočty oddelene v každej skupine.

1. Vytváranie skupín (GROUP BY)

Skupiny sa vytvárajú pomocou návrhu GROUP BY operátor VYBRAŤ. Pozrime sa na príklad.

VYBRAŤ Produkt, SÚČET(Množstvo) AKO Číslo_výrobku ZO SKUPINY súčtu produktov PODĽA produktu

Touto požiadavkou sme získali informácie o počte predaných produktov za každý mesiac. Operátor VYBRAŤ príkazy na výstup dvoch stĺpcov Produkt- názov produktu a Product_num- výpočtové pole, ktoré sme vytvorili na zobrazenie množstva predaných produktov (vzorec poľa SUM (Množstvo)). Ponuka GROUP BY povie DBMS, aby zoskupil údaje podľa stĺpca Produkt. Za zmienku tiež stojí GROUP BY by malo prísť po vete KDE a predtým ZORADIŤ PODĽA.

2. Filtrovať skupiny (HAVING)

Rovnako ako sme filtrovali riadky v tabuľke, môžeme filtrovať podľa zoskupených údajov. Na tento účel v SQL existuje operátor MAJÚCE. Vezmime si predchádzajúci príklad a pridáme filtrovanie podľa skupín.

VYBRAŤ Produkt, SÚČET (množstvo) AKO číslo_výrobku ZO SKUPINY súčtu produktov PODĽA produktu SÚČET (Množstvo) > 4000

Vidíme, že po vypočítaní množstva predaného tovaru pre každý produkt DBMS „odrezal“ tie produkty, ktorých sa predalo menej ako 4000 kusov.

Ako vidíme, operátor MAJÚCE veľmi podobný operátorovi KDE majú však medzi sebou významný rozdiel: KDE filtruje údaje pred ich zoskupením a MAJÚCE- po zoskupení vykoná filtrovanie. Čiže riadky, ktoré boli návrhom odstránené KDE NEBUDE zaradený do skupiny. Takže operátori KDE A MAJÚCE možno použiť v tej istej vete. Pozrime sa na príklad:

VYBRAŤ Produkt, SUM(množstvo) AKO Product_num FROM Sumproduct WHERE Produkt<>"Lyže dlhé" SKUPINA PODĽA PRODUKTOV S SÚČTOM (množstvom) > 4000

Operátor sme pridali k predchádzajúcemu príkladu KDE kde bol výrobok uvedený Lyže dlhé, čo následne ovplyvnilo zoskupovanie operátorom MAJÚCE. V dôsledku toho vidíme, že produkt Lyže dlhé nebola zaradená do zoznamu skupín s počtom predaných výrobkov nad 4000 ks.

3. Zoskupovanie a triedenie

Rovnako ako pri bežnom získavaní údajov môžeme skupiny triediť po zoskupení s operátorom MAJÚCE. Na to môžeme použiť operátora, ktorý už poznáme ZORADIŤ PODĽA. V tejto situácii je jeho aplikácia podobná ako v predchádzajúcich príkladoch. Napr.:

VYBRAŤ Produkt, SÚČET (množstvo) AKO číslo_výrobku ZO SKUPINY súčtu produktov PODĽA produktu SÚČET (množstvo) > 3000 OBJEDNAŤ PODĽA SÚČTU (množstvo)

alebo jednoducho uveďte číslo poľa v poradí, podľa ktorého chceme triediť:

VYBRAŤ Produkt, SÚČET (množstvo) AKO číslo_výrobku ZO SKUPINY súčtu produktov PODĽA produktu SÚČET (Množstvo) > 3000 OBJEDNAJTE BY 2

Vidíme, že na triedenie súhrnných výsledkov nám stačí písať vety pomocou ZORADIŤ PODĽA po operátorovi MAJÚCE. Je tu však jedno upozornenie. Prístup k DBMS nepodporuje triedenie skupín podľa aliasov stĺpcov, to znamená, že v našom príklade, aby sme zoradili hodnoty, nebudeme môcť napísať na koniec požiadavky ORDER BY Product_num.

V tomto článku vám na príklade niekoľkých dotazov poviem, ako sú údaje zoskupené, ako správne používať zoskupovanie podľa a mať vnútri dotazov SQL.

Väčšina informácií v databázach je uložená v podrobnej forme. Často je však potrebné získať správy. Zistite napríklad celkový počet komentárov používateľov alebo možno množstvo tovaru na skladoch. Podobných úloh je veľa. Preto jazyk SQL špecificky poskytuje pre takéto prípady zoskupenie podľa a s konštruktmi, ktoré umožňujú zoskupovať a filtrovať výsledné skupiny údajov.

Ich používanie však spôsobuje začínajúcim autorom softvérových výtvorov mnohé problémy. Nie celkom správne interpretujú získané výsledky a samotný mechanizmus zoskupovania údajov. Poďme preto v praxi zistiť, čo sa deje a ako.

V rámci príkladu budem uvažovať len o jednej tabuľke. Dôvod je jednoduchý, tieto operátory sú už aplikované na výslednú vzorku údajov (po skombinovaní riadkov tabuľky a ich filtrovaní). Takže pridanie operátorov kde a pripojiť sa nezmení podstatu.

Predstavme si abstraktný príklad. Povedzme, že máte súhrnnú tabuľku používateľov fóra. Nazvime to userstat a vyzerá to takto. Dôležitým bodom je, že veríme, že používateľ môže patriť len do jednej skupiny.

user_name – meno používateľa

forum_group – názov skupiny

mess_count - počet správ

is_have_social_profile – či profil fóra obsahuje odkaz na stránku na sociálnej sieti

Ako vidíte, tabuľka je jednoduchá a veľa vecí si viete vypočítať sami pomocou kalkulačky. Toto je však len príklad a je tam len 10 záznamov. V reálnych databázach možno záznamy merať v tisícoch. Začnime teda otázkami.

Čisté zoskupenie pomocou skupiny podľa

Predstavme si, že potrebujeme poznať hodnotu každej skupiny, konkrétne priemerné hodnotenie používateľov v skupine a celkový počet správ zanechaných vo fóre.

Najprv krátky slovný popis na uľahčenie pochopenia SQL dotazu. Takže musíte nájsť vypočítané hodnoty podľa skupín fóra. Podľa toho je potrebné rozdeliť všetkých týchto desať riadkov do troch rôznych skupín: admin, moder, user. Ak to chcete urobiť, musíte pridať zoskupenie podľa hodnôt poľa forum_group na konci požiadavky. A tiež pridať vypočítané výrazy na výber pomocou takzvaných agregačných funkcií.

Špecifikujte polia a vypočítané stĺpce vyberte forum_group, avg(raiting) ako avg_raiting, sum(mess_count) ako total_mess_count -- Zadajte tabuľku z userstat -- Zadajte zoskupenie podľa skupiny polí podľa forum_group

Upozorňujeme, že po použití skupiny podľa konštrukcie v dotaze môžete použiť iba tie polia vo výbere, ktoré boli zadané za skupinou bez použitia agregačných funkcií. Zostávajúce polia musia byť špecifikované vo vnútri agregačných funkcií.

Použil som aj dve agregačné funkcie. AVG - vypočíta priemernú hodnotu. A SUM - vypočíta súčet.

forum_grouppriemerné hodnotenietotal_mess_count
admin 4 50
moderátor 3 50
užívateľ 3 150

1. Najprv boli všetky riadky zdrojovej tabuľky rozdelené do troch skupín podľa hodnôt poľa forum_group. Napríklad v skupine správcov boli traja používatelia. Vo vnútri modera sú tiež 3 riadky. A vo vnútri skupiny používateľov boli 4 riadky (štyria používatelia).

2. Na každú skupinu sa potom aplikovali súhrnné funkcie. Napríklad pre skupinu správcov sa priemerné hodnotenie vypočítalo takto (2 + 5 + 5)/3 = 4. Počet správ sa vypočítal ako (10 + 15 + 25) = 50.

Ako vidíte, nič zložité. Použili sme však iba jednu podmienku zoskupenia a nefiltrovali sme podľa skupiny. Prejdime teda k ďalšiemu príkladu.

Zoskupovanie pomocou group by a filtrovanie skupín pomocou has

Teraz sa pozrime na zložitejší príklad zoskupovania údajov. Povedzme, že potrebujeme vyhodnotiť efektívnosť akcií na prilákanie používateľov k sociálnym aktivitám. Zjednodušene povedané, zistite, koľko používateľov v skupinách zanechalo odkazy na svoje profily a koľko ignorovaných správ atď. V skutočnom živote však môže existovať veľa takýchto skupín, takže musíme odfiltrovať tie skupiny, ktoré možno zanedbať (napríklad príliš málo ľudí nezanechalo odkaz; načo zapĺňať celú správu). V mojom príklade sú to skupiny iba s jedným používateľom.

Najprv verbálne popíšeme, čo je potrebné urobiť v SQL dotaze. Musíme rozdeliť všetky riadky pôvodnej tabuľky používateľských štatistík podľa nasledujúcich kritérií: názov skupiny a prítomnosť sociálneho profilu. Podľa toho je potrebné zoskupiť údaje tabuľky podľa polí forum_group a is_have_social_profile. Nás však nezaujímajú tie skupiny, kde je len jeden človek. Preto je potrebné takéto skupiny odfiltrovať.

Poznámka: Stojí za to vedieť, že tento problém možno vyriešiť zoskupením iba podľa jedného poľa. Ak použijete prípad konštrukcie. V rámci tohto príkladu sú však znázornené možnosti zoskupovania.

Chcel by som tiež okamžite objasniť jeden dôležitý bod. Pri použití agregovaných funkcií môžete filtrovať iba pomocou has a nie podľa jednotlivých polí. Inými slovami, toto nie je kde konštrukcia, je to filter pre skupiny riadkov, nie jednotlivé záznamy. Hoci podmienky vo vnútri sú špecifikované podobným spôsobom pomocou „alebo“ a „a“.

Takto by vyzeral SQL dotaz

Špecifikujte polia a vypočítané stĺpce vyberte forum_group, is_have_social_profile, count(*) as total -- Určite tabuľku z userstat -- Určte zoskupenie podľa polí group by forum_group, is_have_social_profile -- Zadajte skupinový filter s počtom (*) > 1

Upozorňujeme, že polia za skupinou podľa konštrukcie sú oddelené čiarkami. Špecifikovanie polí vo výbere prebieha rovnakým spôsobom ako v predchádzajúcom príklade. Použil som aj agregovanú funkciu count, ktorá počíta počet riadkov v skupinách.

Tu je výsledok:

forum_groupis_have_social_profileCelkom
admin 1 2
moderátor 1 2
užívateľ 0 3

Poďme sa postupne pozrieť na to, ako tento výsledok dopadol.

1. Spočiatku bolo získaných 6 skupín. Každá zo skupín forum_group bola rozdelená do dvoch podskupín na základe hodnôt poľa is_have_social_profile. Inými slovami, skupiny: , , , , , .

Poznámka: Mimochodom, skupín by nemuselo byť nevyhnutne 6. Ak by teda napríklad všetci správcovia vyplnili profil, bolo by skupín 5, keďže pole is_have_social_profile by malo pre používateľov skupiny admin iba jednu hodnotu.

2. Potom sa na každú skupinu použila podmienka filtra v have. Preto boli vylúčené tieto skupiny: , , . Pretože v každej takejto skupine bol iba jeden riadok zdrojovej tabuľky.

3. Potom sa vypočítali potrebné údaje a získal sa výsledok.

Ako vidíte, nie je nič ťažké používať.

Stojí za to vedieť, že v závislosti od databázy sa schopnosti týchto konštruktov môžu líšiť. Napríklad môže existovať viac agregovaných funkcií alebo môžete zadať vypočítané stĺpce namiesto jednotlivých polí ako zoskupenie. Na tieto informácie sa treba pozrieť už v špecifikácii.

Teraz viete, ako zoskupiť údaje pomocou skupiny podľa, ako aj ako filtrovať skupiny pomocou has.


Posledná aktualizácia: 19.07.2017

T-SQL používa na zoskupenie údajov príkazy GROUP BY a HAVING pomocou nasledujúcej formálnej syntaxe:

VYBERTE stĺpce z tabuľky

GROUP BY

Klauzula GROUP BY určuje, ako budú riadky zoskupené.

Zoraďme produkty napríklad podľa výrobcu

SELECT Výrobca, COUNT(*) AS ModelsCount FROM Products GROUP BY Výrobca

Prvý stĺpec v príkaze SELECT - Výrobca predstavuje názov skupiny a druhý stĺpec - ModelsCount predstavuje výsledok funkcie Count, ktorá počíta počet riadkov v skupine.

Stojí za zváženie, že každý stĺpec, ktorý sa používa v príkaze SELECT (nepočítajúc stĺpce, v ktorých sú uložené výsledky agregačných funkcií), musí byť špecifikovaný za klauzulou GROUP BY. Takže napríklad vo vyššie uvedenom prípade je stĺpec Výrobca špecifikovaný v klauzulách SELECT aj GROUP BY.

A ak príkaz SELECT vyberá jeden alebo viac stĺpcov a používa aj agregačné funkcie, musíte použiť klauzulu GROUP BY. Nasledujúci príklad teda nebude fungovať, pretože neobsahuje výraz zoskupenia:

SELECT Výrobca, COUNT(*) AS ModelyPočet FROM produktov

Ďalší príklad, pridajte zoskupenie podľa počtu produktov:

SELECT Výrobca, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Výrobca, ProductCount

Klauzula GROUP BY môže zoskupovať do viacerých stĺpcov.

Ak stĺpec, podľa ktorého zoskupujete, obsahuje hodnotu NULL, riadky s hodnotou NULL vytvoria samostatnú skupinu.

Upozorňujeme, že klauzula GROUP BY musí nasledovať za klauzulou WHERE, ale pred klauzulou ORDER BY:

SELECT Výrobca, COUNT(*) AS ModelyPočet FROM Products WHERE Cena > 30000 GROUP BY Výrobca OBJEDNAŤ PODĽA modelovPočet DESC

Skupinové filtrovanie. MAJÚCE

Operátor MAJÚCE určuje, ktoré skupiny budú zahrnuté do výsledku výstupu, to znamená, že skupiny filtruje.

Použitie HAVING je v mnohom podobné ako použitie WHERE. Iba WHERE sa používa na filtrovanie riadkov, HAVING sa používa na filtrovanie skupín.

Napríklad, nájdime všetky skupiny produktov podľa výrobcu, pre ktoré je definovaných viac ako 1 model:

SELECT Výrobca, COUNT(*) AS ModelsCount FROM Products GROUP BY Výrobca HAVING COUNT(*) > 1

V tomto prípade môžeme v jednom príkaze použiť výrazy WHERE a HAVING:

SELECT Výrobca, COUNT(*) AS ModelsCount FROM Products WHERE Cena * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1

To znamená, že v tomto prípade sa riadky najskôr filtrujú: vyberú sa tie produkty, ktorých celkové náklady sú vyššie ako 80 000. Potom sa vybrané produkty zoskupia podľa výrobcu. A potom sa filtrujú samotné skupiny – vyberú sa tie skupiny, ktoré obsahujú viac ako 1 model.

Ak je potrebné triediť, za výrazom HAVING nasleduje výraz ORDER BY:

SELECT Výrobca, COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Cena * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

V tomto prípade je zoskupenie podľa výrobcu a tiež sa vyberá počet modelov pre každého výrobcu (Models) a celkový počet všetkých produktov pre všetky tieto modely (Units). Na konci sú skupiny zoradené podľa počtu produktov v zostupnom poradí.

V tomto návode sa naučíte používať príkaz SQL GROUP BY so syntaxou a príkladmi.

Popis

Klauzula SQL GROUP BY sa môže použiť v príkaze SELECT na zhromaždenie údajov vo viacerých záznamoch a zoskupenie výsledkov do jedného alebo viacerých stĺpcov.

Syntax

Syntax pre príkaz GROUP BY v SQL je:

Parametre alebo argumenty

expression1 , expression2 , … expression_n Výrazy, ktoré nie sú zapuzdrené v agregačnej funkcii a musia byť zahrnuté v GROUP BY na konci SQL dotazu. agregovaná_funkcia Toto je súhrnná funkcia, ako napríklad SUM, COUNT, MIN, MAX alebo AVG. agregovaný_výraz Toto je stĺpec alebo výraz, pre ktorý sa použije funkcia agregátu. tables Tabuľky, z ktorých chcete získať záznamy. Klauzula FROM musí špecifikovať aspoň jednu tabuľku. KDE podmienky Voliteľné. Toto sú podmienky, ktoré musia byť splnené pre výber záznamov. OBJEDNAŤ PODĽA výrazu Voliteľné. Výraz použitý na triedenie záznamov v sade výsledkov. Ak je zadaných viac ako jeden výraz, hodnoty musia byť oddelené čiarkami. ASC Voliteľné. ASC triedi sadu výsledkov vo vzostupnom poradí podľa výrazu. Toto je predvolené správanie, ak nie je zadaný žiadny modifikátor. DESC Voliteľné. DESC triedi sadu výsledkov v zostupnom poradí podľa výrazu .

Príklad - Použitie GROUP BY s funkciou SUM

Pozrime sa, ako používať GROUP BY s funkciou SUM v SQL.
V tomto príklade máme tabuľku zamestnancov s nasledujúcimi údajmi:

dept_id celkové_platy
500 119500
501 113000

V tomto príklade sme použili funkciu SUM na sčítanie všetkých platov pre každý identifikátor oddelenia a výsledku SUM(plat) sme priradili alias „total_salaries“. Keďže dept_id nie je zapuzdrené vo funkcii SUM, musí byť špecifikované v klauzule GROUP BY.

Príklad - Použitie GROUP BY s funkciou COUNT

Pozrime sa, ako použiť klauzulu GROUP BY s funkciou COUNT v SQL.

V tomto príklade máme tabuľku produktov s nasledujúcimi údajmi:

V tomto príklade sme použili funkciu COUNT na výpočet počtu total_products pre každý category_id a ako výsledky funkcie COUNT sme zadali alias "total_products". Všetky hodnoty category_id, ktoré sú NULL, sme vylúčili filtrovaním v klauzule WHERE. Pretože category_id nie je zapuzdrený vo funkcii COUNT, musí byť špecifikovaný v klauzule GROUP BY.

Príklad - Použitie GROUP BY s funkciou MIN

Pozrime sa teraz, ako použiť klauzulu GROUP BY s funkciou MIN v SQL.

V tomto príklade opäť použijeme tabuľku zamestnancov s nasledujúcimi údajmi:

Vyberú sa 2 záznamy. Tu sú výsledky, ktoré získate:

dept_id najnižší_plat
500 57500
501 42000

V tomto príklade sme použili funkciu MIN na vrátenie najnižšej hodnoty platu pre každé dept_id a aliasovali sme výsledky funkcie MIN „najnižší_plat“. Keďže dept_id nie je zapuzdrené vo funkcii MIN, musí byť špecifikované v klauzule GROUP BY.

Príklad - Použitie GROUP BY s funkciou MAX

Nakoniec sa pozrime na to, ako použiť klauzulu GROUP BY s funkciou MAX.

Opäť použijeme tabuľku zamestnancov, ale tentoraz nájdime najvyššiu mzdu pre každé dept_id:

číslo zamestnanca krstné meno priezvisko plat dept_id
1001 Justin Bieber 62000 500
1002 Selena Gomez 57500 500
1003 Mila Kunis 71000 501
1004 Tom Plavba 42000 501

Zadajte nasledujúci príkaz SQL.

Priezvisko

Rok narodenia

Ivanovič

Petrovič

Michajlovič

Borisovič

Nikolajevna

Sidorovej

Catherine

Ivanovna

Valentína

Sergejevič

Anatoly

Michajlovič

Ryža. 4.20. Použitie LIKE "^[D-M]%"

Teraz môžete vytvárať predikáty v zmysle špeciálne definovaných vzťahov SQL. Môžete vyhľadávať hodnoty v konkrétnom rozsahu (BETWEEN) alebo číselnej množine (IN), alebo môžete hľadať hodnoty znakov, ktoré zodpovedajú textu v rámci parametrov (LIKE).

4.4. GROUP BY a agregačné funkcie SQL

Výsledkom dotazu môže byť zovšeobecnená skupinová hodnota polí, rovnako ako hodnota jedného poľa. Toto sa vykonáva pomocou štandardných agregačných funkcií SQL, ktoré sú uvedené nižšie:

Okrem špeciálneho prípadu COUNT(*) každá z týchto funkcií pracuje so zbierkou hodnôt v stĺpci nejakej tabuľky a vytvára iba jednu hodnotu.

Argumentu všetkých funkcií okrem COUNT(*) môže predchádzať kľúčové slovo DISTINCT, čo znamená, že duplicitné hodnoty stĺpca

musí byť pred použitím funkcie vylúčené. Špeciálna funkcia COUNT(*) slúži na sčítanie všetkých riadkov v tabuľke bez výnimky (vrátane duplikátov).

Agregačné funkcie sa používajú podobne ako názvy polí v klauzule dotazu SELECT, s jednou výnimkou: berú názvy polí ako argumenty. S SUM a AVG možno použiť iba číselné polia.

Číselné aj znakové polia možno použiť s COUNT, MAX a MIN. Pri použití so znakovými poľami ich MAX a MIN prevedú na ekvivalent kódu ASCII, ktorý by mal oznámiť, že MIN bude znamenať prvú a MAX poslednú hodnotu v abecednom poradí.

Ak chcete nájsť SÚČET všetkých platov v tabuľke ZAMESTNANEC ODDELENIA (obr. 2.3), musíte zadať nasledujúci dotaz:

Z oddelenia_ Zamestnanci;

A na obrazovke uvidíme výsledok: 46800 (tabuľka bude mať jeden stĺpec s názvom SUM).

Výpočet priemernej mzdy je tiež jednoduchý:

VYBERTE AVG ((Plat))

Z oddelenia_ Zamestnanci;

Funkcia COUNT je trochu odlišná od všetkých ostatných. Počíta počet hodnôt v danom stĺpci alebo počet riadkov v tabuľke. Keď počíta hodnoty stĺpca, používa sa s DISTINCT na počítanie počtu jedinečných hodnôt v danom poli.

Tabuľka má osem riadkov obsahujúcich rôzne hodnoty platov.

Všimnite si, že posledné tri príklady zohľadňujú aj informácie o prepustených zamestnancoch.

Nasledujúca veta vám umožňuje určiť počet dielikov na

DISTINCT, za ktorým nasleduje názov poľa, na ktoré sa vzťahuje, v zátvorkách, pričom na jednotlivé stĺpce sa použije COUNT.

VYBRAŤ POČET (*)

Z oddelenia_ Zamestnanci;

Odpoveď bude:

COUNT(*) počíta každý riadok v tabuľke.

DISTINCT sa nedá použiť s COUNT (*).

Predpokladajme, že tabuľka PAYMENT_STATE (obr. 2.4) má ešte jeden stĺpec, v ktorom je uložená výška vykonaných zrážok (pole Odpočet) pre každý riadok výpisu. Potom ak máte záujem o celú sumu, tak obsah stĺpcov Čiastka a Odpočet treba spočítať.

Ak máte záujem o maximálnu sumu, berúc do úvahy zrážky, obsiahnutú vo výpise, môžete tak urobiť pomocou nasledujúcej vety:

VYBRAŤ MAX (súčet + odpočet)

Z Výplatného_hárku;

Pre každý riadok v tabuľke tento dotaz pridá hodnotu poľa Čiastka s hodnotou poľa Odpočet a vyberie najväčšiu hodnotu, ktorú nájde.

SKUPINA PODĽA klauzuly (zmena usporiadania, objednávka)

Klauzula GROUP BY vám umožňuje definovať podmnožinu hodnôt v konkrétnom poli z hľadiska iného poľa a použiť na podmnožinu súhrnnú funkciu. To umožňuje kombinovať polia a agregačné funkcie do jednej klauzuly SELECT.

Predpokladajme napríklad, že chcete určiť, koľko zamestnancov je v každom oddelení (odpoveď je znázornená na obrázku 4.21):

SELECT Department_ID, COUNT (DISTINCT Department_ID) AS Počet_zamestnancov

Oddelenie_ Zamestnanci

Dátum prepustenia

Počet zamestnancov

Klauzula GROUP BY ponecháva iba jedinečné hodnoty stĺpcov, štandardne zoradené vzostupne. V tomto aspekte sa klauzula GROUP BY líši od klauzuly ORDER BY v tom, že klauzula ORDER BY, hoci zoraďuje záznamy vzostupne, neodstraňuje duplicitné hodnoty. V uvedenom príklade dotaz zoskupuje riadky tabuľky podľa hodnôt stĺpca Dept_ID (podľa čísel oddelení). Riadky s rovnakými číslami oddelení sa najskôr spoja do skupín, ale pre každú skupinu sa zobrazí iba jeden riadok. Druhý stĺpec zobrazuje počet riadkov v každej skupine, t.j. počet zamestnancov v každom oddelení.

Hodnota poľa, na ktoré sa použije GROUP BY, má podľa definície iba jednu hodnotu na výstupnú skupinu, rovnako ako agregovaná funkcia. Výsledkom je kompatibilita, ktorá umožňuje takýmto spôsobom kombinovať kamenivo a polia.

Nech napríklad tabuľka PAYMENT_LIST vyzerá ako na obr. 4.22 a chceme určiť maximálnu sumu vyplatenú na výplatnej páske každému zamestnancovi.

Typ platby

V dôsledku toho dostaneme.

Ryža. 4.23. Agregátna funkcia s AS

Zoskupovanie je možné vykonať podľa niekoľkých atribútov:

Z Hárok1

GROUP BY Employee_id, Date;

výsledok:

Ryža. 4.24. Zoskupovanie podľa viacerých atribútov

Ak je potrebné obmedziť počet skupín získaných po GROUP BY, môžete to implementovať pomocou klauzuly HAVING.

4.5. Použitie frázy HAVING

Klauzula HAVING hrá rovnakú úlohu pre skupiny ako klauzula WHERE pre riadky: používa sa na vylúčenie skupín, rovnako ako sa používa na vylúčenie riadkov WHERE. Táto veta je zahrnutá vo vete

iba ak existuje klauzula GROUP BY a výraz v HAVING musí mať jednu hodnotu pre skupinu.

Povedzme napríklad, že potrebujeme ukázať kvantitatívne zloženie všetkých oddelení (obr. 2.3), okrem oddelenia číslo 3.

SELECT Department_ID, COUNT (DISTINCT Department_ID) AS Počet _employees

Oddelenie_ Zamestnanci

Dátum prepustenia

MÁ ID_oddelenie< > 3;

Počet zamestnancov

Posledným prvkom pri vyhodnocovaní tabuľkového výrazu je sekcia HAVING (ak existuje). Syntax tejto sekcie je nasledovná:

::=

MAJÚCE

Podmienka vyhľadávania v tejto časti špecifikuje podmienku pre skupinu riadkov v zoskupenej tabuľke. Formálne môže byť sekcia HAVING prítomná aj v tabuľkovom výraze, ktorý neobsahuje GROUP BY. V tomto prípade sa predpokladá, že výsledkom výpočtu predchádzajúcich oddielov je zoskupená tabuľka pozostávajúca z jednej skupiny bez vyhradených stĺpcov zoskupenia.

Podmienka vyhľadávania klauzuly HAVING sa riadi rovnakými syntaktickými pravidlami ako podmienka vyhľadávania klauzuly WHERE a môže obsahovať rovnaké predikáty.

Existujú však špeciálne syntaktické obmedzenia týkajúce sa použitia špecifikácií stĺpcov tabuľky z klauzuly FROM daného tabuľkového výrazu v podmienkach vyhľadávania. Tieto obmedzenia vyplývajú zo skutočnosti, že podmienka vyhľadávania sekcie HAVING nastavuje podmienku pre celú skupinu, a nie pre jednotlivé riadky.

Preto v predikátových aritmetických výrazoch zahrnutých vo výberovej klauzule klauzuly HAVING možno priamo použiť iba špecifikácie stĺpcov špecifikovaných ako zoskupovacie stĺpce v klauzule GROUP BY. Zvyšné stĺpce je možné zadať len v rámci špecifikácií agregačných funkcií COUNT, SUM, AVG, MIN a MAX, ktoré v tomto prípade vypočítajú nejakú agregovanú hodnotu pre celú skupinu riadkov. Situácia je podobná s poddotazmi zahrnutými v predikátoch výberovej podmienky sekcie HAVING: ak poddotaz používa charakteristiku aktuálnej skupiny, potom ju možno špecifikovať iba odkazom na stĺpce zoskupenia.

Nech je dotaz vo forme (základnú tabuľku pozri na obr. 4.22):

SELECT Employee_id, Date, MAX ((Suma))

Z Hárok1

GROUP BY Employee_id, Date;

je potrebné objasniť, aby sa zobrazovali iba platby nad 1000.

Štandardne je však nezákonné používať agregovanú funkciu v klauzule WHERE (pokiaľ nepoužijete poddotaz, popísaný neskôr), pretože predikáty sa vyhodnocujú z hľadiska jedného riadka a agregačné funkcie sa vyhodnocujú z hľadiska skupiny riadkov. .

Nasledujúca veta by bola nesprávna:

SELECT Id_id, Date, MAX (Suma)

Z Hárok1

WHERE MAX ((Sum)) > 1000 GROUP BY Comp_Id, Date;

Správna veta by bola:

SELECT Employee_id, Date, MAX ((Suma))