TOP

SQL-Lecția 8. Gruparea datelor (GROUP BY)

Gruparea datelor vă permite să împărțiți toate datele în seturi logice, ceea ce face posibilă efectuarea de calcule statistice separat în fiecare grup.


1. Crearea de grupuri (GROUP BY)

Grupurile sunt create folosind instrucțiunea GROUP BY a operatorului SELECT. Să luăm în considerare un exemplu.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

Cu această solicitare, am extras informații despre numărul de produse vândute în fiecare lună. Operatorul SELECT ordonă să iasă două coloane Product - numele produsului și Product_num - câmpul calculat pe care l-am creat pentru a afișa cantitatea de produse vândute (formula câmp SUM(Quantity)). Clauza GROUP BY spune DBMS să grupeze datele după coloana Produs.

De asemenea, este de remarcat faptul că GROUP BY trebuie să apară după clauza WHERE și înainte de ORDER BY.

2. Grupuri de filtrare (HAVING)

Așa cum am filtrat rândurile dintr-un tabel, putem filtra datele grupate. Pentru aceasta, există operatorul HAVING în SQL. Să luăm exemplul anterior și să adăugăm filtrarea de grup.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Putem observa că după ce s-a calculat numărul de bunuri vândute pentru fiecare produs, SGBD-ul „taie” acele produse care au fost vândute mai puțin de 4.000 de unități.

După cum puteți vedea, operatorul HAVING este foarte asemănător cu operatorul WHERE, dar există o diferență semnificativă între ele: WHERE filtrează datele înainte de a fi grupate, iar HAVING filtrează după grupare. Astfel, rândurile care au fost eliminate de clauza WHERE nu vor fi incluse în grup. Deci, operatorii WHERE și HAVING pot fi folosiți în aceeași propoziție. Luați în considerare un exemplu:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Am adăugat operatorul WHERE la exemplul anterior, unde am specificat produsul „Skis Long”, care la rândul său a afectat gruparea după operatorul HAVING. Ca urmare, putem observa că produsul „Skis Long” nu a intrat în lista grupurilor cu peste 4.000 de produse vândute.

3. Gruparea și sortarea

Ca și în cazul eșantionării normale a datelor, putem sorta grupurile după gruparea cu operatorul HAVING. Pentru aceasta, putem folosi operatorul deja familiar ORDER BY. În această situație, aplicarea sa este similară cu exemplele anterioare. Exemplu:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

sau pur și simplu specificați numărul câmpului în ordinea în care dorim să sortăm:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

Vedem că pentru a sorta rezultatele rezumate, trebuie doar să scriem clauza cu ORDER BY după operatorul HAVING.

MS Access nu acceptă sortarea grupurilor după aliasuri de coloană, adică în exemplul nostru, pentru a sorta valorile, nu vom putea scrie ORDER BY Product_num la sfârșitul interogării.