SQL GROUP BY — guruhlab hisoblash
Ba’zan har bir qator emas, guruh bo’yicha umumiy hisob kerak bo’ladi:
“har turdan nechta mahsulot bor?” yoki “har mijoz nechta buyurtma qilgan?”.
Bunday savollarga GROUP BY javob beradi — u bir xil qiymatli
qatorlarni guruhlaydi va har guruhni bittaga jamlaydi.
mahsulotlar jadvalidan foydalanamiz:
| id | nom | narx | soni | turi |
|---|---|---|---|---|
| 1 | Olma | 8000 | 50 | meva |
| 2 | Non | 3000 | 120 | non |
| 3 | Sut | 12000 | 30 | sut mahsuloti |
| 4 | Choy | 15000 | 40 | ichimlik |
| 5 | Banan | 14000 | 25 | meva |
| 6 | Qatiq | 9000 | 0 | sut mahsuloti |
| 7 | Suv | 4000 | 200 | ichimlik |
| 8 | Guruch | 18000 | 60 | don |
GROUP BY — guruhlab sanash
Har turda nechta mahsulot borligini bilaylik. GROUP BY turi bir xil turli
qatorlarni birlashtiradi, COUNT(*) esa har guruhdagi qatorlarni sanaydi:
SELECT turi, COUNT(*) AS soni FROM mahsulotlar GROUP BY turi;
O’zingiz ishga tushirib ko’ring — so’rovni tahrirlashingiz ham mumkin:
Natija — har tur bitta qatorga jamlandi:
| turi | soni |
|---|---|
| don | 1 |
| ichimlik | 2 |
| meva | 2 |
| non | 1 |
| sut mahsuloti | 2 |
Sakkiz qator beshta guruhga aylandi. COUNT(*) — har guruhda nechta qator
borligi.
Guruh bo’yicha yig’indi
SUM bilan har guruhdagi qiymatlarni qo’shamiz. Har turda jami nechta dona
mahsulot borligini topamiz:
SELECT turi, SUM(soni) AS jami_soni FROM mahsulotlar GROUP BY turi;
Natija:
| turi | jami_soni |
|---|---|
| don | 60 |
| ichimlik | 240 |
| meva | 75 |
| non | 120 |
| sut mahsuloti | 30 |
Ichimlik 240 (Choy 40 + Suv 200), meva 75 (Olma 50 + Banan 25) — har guruh
ichidagi soni qo’shildi.
HAVING — guruhlarni filtrlash
Guruhlangan natijani filtrlash kerak bo’lsa, WHERE emas, HAVING
ishlatiladi. Faqat birdan ko’p mahsulotli turlarni olamiz:
SELECT turi, COUNT(*) AS soni FROM mahsulotlar
GROUP BY turi
HAVING COUNT(*) > 1;
Natija — faqat 2 mahsulotli turlar (don va non tushib qoldi):
| turi | soni |
|---|---|
| ichimlik | 2 |
| meva | 2 |
| sut mahsuloti | 2 |
GROUP BY va JOIN birga
GROUP BY ko’pincha JOIN bilan ishlatiladi. Har mijoz
nechta buyurtma qilganini bilaylik:
SELECT m.ism, COUNT(*) AS buyurtmalar_soni
FROM buyurtmalar AS b
JOIN mijozlar AS m ON b.mijoz_id = m.id
GROUP BY m.ism;
Natija:
| ism | buyurtmalar_soni |
|---|---|
| Aziz | 3 |
| Bobur | 1 |
| Dilnoza | 2 |
Avval jadvallar bog’landi, keyin natija mijoz ismi bo’yicha guruhlanib sanaldi.
Amaliy mashq
Guruhlab hisoblang:
- Har
turibo’yicha mahsulotlar sonini chiqaring; SUM(soni)bilan har toifadagi jami donani hisoblang;AVG(narx)bilan o’rtacha narxni qo’shing;- natijani
ORDER BYbilan songa qarab tartiblang; GROUP BYni olib tashlang — qanday xato yoki natija chiqdi?
5-qadam GROUP BY nima uchun kerakligini ko’rsatadi.
Qisqacha xulosa
GROUP BY ustun— bir xil qiymatli qatorlarni bitta guruhga jamlaydi.- Har guruhga agregat funksiya qo’llanadi:
COUNT(*)(sanaydi),SUM(ustun)(qo’shadi). HAVING— guruhlarni filtrlaydi (guruhlashdan keyin);WHEREesa qatorlarni (guruhlashdan oldin).GROUP BYko’pinchaJOINbilan ishlatiladi — masalan har mijoz bo’yicha hisob.- Tartib:
... WHERE ... GROUP BY ... HAVING ... ORDER BY ....
Keyingi darsda agregat funksiyalar — COUNT,
SUM, AVG, MIN, MAX ni batafsil ko’ramiz. Bu SQL Boshlang’ich
bo’limining yakuniy darsi.