AXV

GROUP BY va HAVING

Ko'p satrdan bitta hisobot: agregat funksiyalar va guruhlash

10-sinfBI & ML4-hafta · 10-dars

3-hafta: nima qildik?

maktab.db

hududlar, maktablar, yillik_kpi jadvallari

WHERE

Satrlarni shart bilan saralash

ORDER BY + LIMIT

TOP-N tahlili va sahifalash

Bugun: bitta satr emas, butun guruh haqida hisobot.

01

Agregat funksiyalar

Ko'p satr, bitta natija

Agregatsiya: 15 qator, 1 son

yillik_kpi hudud 1 · 2022 · 470000 hudud 1 · 2023 · 478000 ... jami 15 qator SUM(...) 7 434 000 jami o'quvchi

Beshta asosiy funksiya

COUNT

Nechta?

SUM

Yig'indi

AVG

O'rtacha

MIN / MAX

Eng kam / eng ko'p

Hammasi NULL larni o'tkazib yuboradi. Faqat COUNT(*) hamma satrni sanaydi.

Birinchi hisobot


SELECT COUNT(*)  AS yozuvlar,
       SUM(oquvchilar_soni) AS jami,
       ROUND(AVG(oquvchilar_soni), 0) AS ortacha,
       MAX(oquvchilar_soni) AS eng_kop
FROM yillik_kpi;
  
Natija: 15 | 7 434 000 | 495 600 | 620 000

COUNT(*) yoki COUNT(ustun)?

COUNT(*)

bosing

Barcha satrlarni sanaydi, NULL bo'lsa ham.

COUNT(ustun)

bosing

Faqat shu ustunda NULL bo'lmagan qiymatlarni sanaydi.

Mini-test

Ustunda 10 satr, 3 tasi NULL. COUNT(ustun) nechta chiqaradi?

COUNT(ustun) NULL larni sanamaydi: 10 - 3 = 7.
02

GROUP BY

Guruhlab hisoblash

Savatlarga ajratamiz

yillik_kpi · 15 qator yil = 2022 5 qator yil = 2023 5 qator yil = 2024 5 qator 2 430 000 2 478 000 2 526 000 SUM(oquvchilar_soni) har savat uchun

Guruhlamasdan


SELECT SUM(oquvchilar_soni)
FROM yillik_kpi;
  

Natija: bitta son.

GROUP BY bilan


SELECT yil, SUM(oquvchilar_soni) AS jami
FROM yillik_kpi
GROUP BY yil
ORDER BY yil;
  

Natija: har yil uchun bitta qator.

Asosiy qoida

SELECT dagi har ustun yoki GROUP BY da bo'lishi, yoki agregat ichida turishi kerak.

Chuqurroq bilish uchun pastga bosing.

Bir nechta ustun bo'yicha


SELECT hudud_id, yil, COUNT(*)
FROM yillik_kpi
GROUP BY hudud_id, yil;
    

Guruh = ustunlar kombinatsiyasi. Shu juftlik takrorlansa, COUNT 1 dan katta bo'ladi.

KPI: o'quvchi / o'qituvchi


SELECT yil,
  ROUND(SUM(oquvchilar_soni) * 1.0
    / NULLIF(SUM(oqituvchilar_soni), 0), 2) AS nisbat
FROM yillik_kpi
GROUP BY yil
ORDER BY yil;
  

NULLIF(x, 0): x nol bo'lsa NULL, nolga bo'lish xatosi yo'q

* 1.0: SQLite da kasr natija olish uchun

GROUP BY ichida nima bo'ladi?

1. Satrlar o'qiladi

FROM jadvalidan hamma satr olinadi.

2. Guruhlarga bo'linadi

Bir xil yil qiymatlari bitta savatga tushadi.

3. Hisoblanadi

SUM/COUNT har savat uchun alohida ishlaydi.

4. Natija

Har guruh bitta qator bo'lib chiqadi.

03

HAVING

Guruhlarni filtrlash

WHERE va HAVING

WHERE

Satrlarni filtrlaydi

Guruhlashdan oldin

Agregat yozib bo'lmaydi

VS

HAVING

Guruhlarni filtrlaydi

Guruhlashdan keyin

Agregat yozish mumkin

HAVING ishlashi: 500 000 chegarasi

Buxoro Samarq. Farg'ona Andijon Boshq. HAVING AVG(...) > 500000 qoladi qoladi

Sxema: chegaradan o'tmagan guruhlar (kulrang) natijadan tushib qoladi. Ustun balandliklari shartli.

Ijro tartibi

1 FROM 2 WHERE 3 GROUP BY 4 HAVING 5 SELECT 6 ORDER BY 7 LIMIT

Qutilarni bosing. Yozish tartibi bor, bajarilish tartibi boshqa!

Uchtasi birga


SELECT hudud_id, COUNT(*) AS maktab_soni, SUM(sigim) AS umumiy_sigim
FROM maktablar
WHERE sigim >= 600
GROUP BY hudud_id
HAVING COUNT(*) >= 2
ORDER BY umumiy_sigim DESC;
  
WHERE: satrHAVING: guruh

Xato yoki to'g'ri?


SELECT yil, SUM(oquvchilar_soni)
FROM yillik_kpi
WHERE SUM(oquvchilar_soni) > 2500000
GROUP BY yil;
    

WHERE da agregat: guruhlar hali yo'q!


SELECT yil, SUM(oquvchilar_soni)
FROM yillik_kpi
GROUP BY yil
HAVING SUM(oquvchilar_soni) > 2500000;
    

Agregat shart HAVING da. Natija: 2024.

Dublikat ovchisi


SELECT hudud_id, yil, COUNT(*) AS soni
FROM yillik_kpi
GROUP BY hudud_id, yil
HAVING COUNT(*) > 1;
  
Natija bo'sh bo'lsa, dublikat yo'q. Ma'lumot sifatini tekshirishning asosiy usuli (uslubiy ko'rsatmadagi validation).

Odatiy xatolar

WHERE da SUM

Agregat shart faqat HAVING da.

GROUP BY da yo'q ustun

SELECT dagi oddiy ustun GROUP BY da bo'lishi shart.

5 / 2 = 2

SQLite da butun bo'linma. * 1.0 qo'shing.

Mini-test: WHERE yoki HAVING?

"Jami o'quvchisi 2 500 000 dan ko'p yillar" sharti qayerga yoziladi?

Agregat natijasi bo'yicha filtr guruhlashdan keyin, HAVING da bajariladi.

Amaliyot 20 daqiqa

OsonMaktab turlari (turi) bo'yicha maktablar soni va o'rtacha sig'imni chiqaring.
O'rta2023 va 2024 uchun yillik jami o'quvchilarni toping, faqat 2 500 000 dan ko'pini qoldiring.
QiyinHududlar bo'yicha 3 yillik jamini hisoblab, 1 500 000 dan ko'p hududlarni kamayish tartibida chiqaring.

Xulosa

Bugun o'rgandik

  • COUNT, SUM, AVG, MIN, MAX
  • GROUP BY: guruhlash
  • HAVING: guruh filtri
  • Ijro tartibi, NULLIF

Uyga vazifa

Yillar va hududlar bo'yicha hisobot, KPI nisbati va dublikat tekshirish (Python skript).

Keyingi dars: JOIN. Jadvallarni bog'laymiz!