Oldal kiválasztása
Tábla módosítása

SQL lekérdezések 2.

GROUP BY

A GROUP BY az SQL nyelvben arra szolgál, hogy az adatokat egy vagy több oszlop alapján csoportosítsa. Ez hasznos lehet például akkor, ha összesített értékeket (mint a SUM, COUNT, AVG, stb.) szeretnénk számolni egy adott csoport minden elemére vonatkozóan.

Alap szintaxis

A GROUP BY szintaxisa a következő:
SELECT oszlop1, oszlop2, aggregált_funkció(oszlop3)
FROM táblanév
WHERE feltétel
GROUP BY oszlop1, oszlop2;

Példa

Tegyük fel, hogy van egy sales nevű táblánk, amely a következő oszlopokat tartalmazza: id, employee_id, amount, és sale_date. Most szeretnénk megtudni, hogy az egyes alkalmazottak mennyi eladást végeztek összesen.

Adatbázis struktúra

sales

——-

id          | employee_id | amount | sale_date

1           | 101         | 150    | 2024-01-01

2           | 102         | 200    | 2024-01-01

3           | 101         | 250    | 2024-01-02

4           | 103         | 300    | 2024-01-03

5           | 102         | 350    | 2024-01-03

SQL Lekérdezés

SELECT employee_id, SUM(amount) 
AS total_sales FROM sales GROUP BY employee_id;

 

Eredmény

employee_id | total_sales

101         | 400

102         | 550

103         | 300

Ebben a példában a GROUP BY employee_id parancs arra utasítja az adatbázist, hogy csoportosítsa az eladásokat alkalmazottanként, és az összesített érték (SUM) kiszámítása ezen csoportok szerint történik.

Több oszlop alapján történő csoportosítás

Ha több oszlop alapján szeretnénk csoportosítani, egyszerűen felsorolhatjuk őket a GROUP BY részben.

Példa

Most szeretnénk az alkalmazottak napi eladásait is látni:

SELECT employee_id, sale_date, SUM(amount)
AS daily_sales FROM sales GROUP BY employee_id, sale_date;

Eredmény

employee_id | sale_date | daily_sales

101         | 2024-01-01 | 150

101         | 2024-01-02 | 250

102         | 2024-01-01 | 200

102         | 2024-01-03 | 350

103         | 2024-01-03 | 300

Feltételek alkalmazása

A GROUP BY használható más SQL parancsokkal is, például a HAVING-gal, ami hasonló a WHERE-hez, de az aggregált adatokra vonatkozik.

Példa

Ha csak azokat az alkalmazottakat szeretnénk listázni, akiknek a napi eladásai meghaladják a 200-at:

SELECT employee_id, sale_date, SUM(amount) 
AS daily_sales FROM sales GROUP BY employee_id, sale_date HAVING SUM(amount) > 200;

Eredmény

employee_id | sale_date | daily_sales

101         | 2024-01-02 | 250

102         | 2024-01-03 | 350

103         | 2024-01-03 | 300

 Összefoglalás

A GROUP BY egy erőteljes eszköz az SQL nyelvben, amely lehetővé teszi az adatok csoportosítását és aggregálását különböző feltételek szerint. Alkalmazásával könnyedén készíthetünk összesítéseket és jelentéseket az adatainkról.

GROUP BY és Aggregáló Függvények

Az aggregáló függvények segítségével számításokat végezhetünk oszlopokon, mint például számolás, összegzés, átlagolás. A GROUP BY záradék lehetővé teszi, hogy ezeket a számításokat adatok csoportjaira alkalmazzuk.

  • Aggregáló függvények:
    • COUNT(): Megszámolja a sorokat.
    • SUM(): Összegzi az értékeket.
    • AVG(): Kiszámolja az átlagot.
    • MIN(): Megadja a minimális értéket.
    • MAX(): Megadja a maximális értéket.

Példák GROUP BY nélkül:

SELECT COUNT(*) FROM Konyvek; 
-- Összes könyv száma
SELECT AVG(kiadasi_ev) FROM Konyvek; 
-- Könyvek átlagos kiadási éve

Példák GROUP BY-val:

SELECT szerzo_id, COUNT(konyv_id) AS KonyvekSzama
FROM Konyvek
GROUP BY szerzo_id;

— Megszámolja, hány könyve van az egyes szerzőknek.

 

SELECT kiadasi_ev, COUNT(konyv_id) AS KonyvekSzama
FROM Konyvek
GROUP BY kiadasi_ev
ORDER BY kiadasi_ev;

— Megszámolja, hány könyv jelent meg egy adott évben, év szerint rendezve.

HAVING Záradék: Hasonló a WHERE-hez, de a GROUP BY által létrehozott csoportokra alkalmaz feltételeket, nem az egyedi sorokra.

SELECT szerzo_id, COUNT(konyv_id) AS KonyvekSzama
FROM Konyvek
GROUP BY szerzo_id
HAVING COUNT(konyv_id) > 2;

— Azok a szerzők, akiknek több mint 2 könyvük van.

A HAVING záradék használata

A HAVING záradék az SQL-ben a GROUP BY záradékkal együtt használatos. Lehetővé teszi, hogy szűrjük a csoportosított adatok eredményeit aggregált függvények alapján, ellentétben a WHERE záradékkal, amely az egyes sorokat szűri a csoportosítás előtt. Más szóval, a HAVING feltételeket aggregált adatokra alkalmazzuk.

A HAVING záradék alapvető használata:

A HAVING záradék a GROUP BY záradék után helyezendő el. Az alapvető szintaxis a következő:

SELECT oszlop1, aggregalt_fuggveny(oszlop2)
FROM tábla
GROUP BY oszlop1
AVING feltétel;

Ahol:

  • oszlop1, aggregalt_fuggveny(oszlop2): A kiválasztott oszlopok nevei és aggregált függvények (pl. COUNT, SUM, AVG, MAX, MIN).
  • tábla: Az adatok forrása.
  • oszlop1: Az oszlop, amely szerint az adatokat csoportosítjuk.
  • feltétel: Az aggregált függvényekre vonatkozó feltétel.

Példák a HAVING záradék használatára:

Egyetlen aggregált feltétel:

A következő példa a „rendelések” táblából választja ki azokat az ügyfél-azonosítókat és a hozzájuk tartozó rendelésszámokat, ahol az ügyfél legalább 5 rendelést adott le:

SELECT customer_id, COUNT(order_id) AS total_orders
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) >= 5;

Ebben az esetben az adatok először customer_id szerint csoportosítva vannak, majd a HAVING záradék csak azokat a csoportokat (ügyfeleket) tartja meg, amelyekben 5 vagy több rendelés található.

Több aggregált feltétel:

A HAVING záradékban több feltételt is megadhatunk a logikai operátorok (AND, OR) segítségével. Az alábbi példa azokat az osztályokat keresi, ahol az átlagos fizetés nagyobb mint 50000 és a dolgozók száma legalább 10:

SELECT department, AVG(salary) AS avg_salary, COUNT(employee_id)
AS num_employees
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000 AND COUNT(employee_id) >= 10;

WHERE vs. HAVING:

Fontos megérteni a különbséget a WHERE és a HAVING záradék között:

  • WHERE záradék: Az egyes sorokat szűri a GROUP BY záradék ELŐTT. Nem használhat aggregált függvényeket a feltételeiben.
  • HAVING záradék: A csoportosított eredményeket szűri a GROUP BY záradék UTÁN. Aggregált függvényeket tartalmazhat a feltételeiben.

Például, ha csak azokat a dolgozókat szeretnénk vizsgálni, akiknek a fizetése 60000 felett van, mielőtt csoportosítanánk őket, akkor a WHERE záradékot használnánk:

SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 60000
GROUP BY department
HAVING AVG(salary) > 70000;

Ez a lekérdezés először kiszűri azokat a dolgozókat, akiknek a fizetése 60000 felett van, majd a maradékot csoportosítja osztályok szerint, végül pedig csak azokat az osztályokat jeleníti meg, ahol az átlagfizetés meghaladja a 70000-et.

1.1.4        Összefoglalás:

Az SQL HAVING záradék elengedhetetlen eszköz a csoportosított adatok szűrésére aggregált függvények alapján. A GROUP BY záradékkal együtt használatos, és lehetővé teszi, hogy olyan feltételeket fogalmazzunk meg, amelyek a csoportok egészére vonatkoznak, nem pedig az egyes sorokra. A WHERE záradékkal ellentétben a HAVING aggregált függvényeket is tartalmazhat feltételeiben, ami rendkívül rugalmassá teszi a csoportosított adatok elemzését.