Bu bo'limda biz bir nechta foydali vositani o'rgandik:
COUNT (sanash), SUM (yig'indi), AVG (o'rtacha), MIN/MAX;Endi shularning hammasini bitta so'rovda birlashtirib, haqiqiy hisobot tuzamiz. Bu — bo'limning loyiha darsi, ya'ni bilimlarni amalda sinab ko'rish vaqti.
Quyidagi mahsulotlar jadvali bilan ishlaymiz:
| id | nomi | kategoriya | narx | ombor |
|---|---|---|---|---|
| 1 | Telefon | Elektronika | 5000000 | 10 |
| 2 | Noutbuk | Elektronika | 12000000 | 5 |
| 3 | Quloqchin | Elektronika | 300000 | 50 |
| 4 | Kitob | Kitoblar | 50000 | 100 |
| 5 | Daftar | Kanstovar | 8000 | 200 |
| 6 | Ruchka | Kanstovar | 3000 | 500 |
| 7 | Stol | Mebel | 800000 | 15 |
| 8 | Stul | Mebel | 250000 | 40 |
Avvalgi darslarda biz GROUP BY bilan har bir kategoriya uchun bitta agregatni hisobladik. Lekin yaxshi hisobotda odatda bir nechta ustun bo'ladi: nechta mahsulot bor, qancha zaxira bor, narxi qanday va hokazo.
Yaxshi xabar shuki, SELECT ichida agregatlarni vergul bilan ajratib, xohlaganchasini yonma-yon yozish mumkin. Ularning har biri o'sha guruh bo'yicha mustaqil hisoblanadi.
Avval mahsulotlar sonini va umumiy ombor zaxirasini birga chiqaramiz:
SELECT kategoriya, COUNT(*), SUM(ombor)
FROM mahsulotlar
GROUP BY kategoriya
ORDER BY kategoriya;Natija — har bir kategoriya uchun bitta qator, uchta ustun (ustunlar | belgisi bilan ajraladi):
Elektronika|3|65
Kanstovar|2|700
Kitoblar|1|100
Mebel|2|55E'tibor bering: COUNT(*) shu guruhdagi qatorlarni sanaydi, SUM(ombor) esa shu guruh ichidagi ombor qiymatlarini qo'shadi. Masalan, Elektronikada 3 ta mahsulot bor va ularning umumiy ombori 10 + 5 + 50 = 65.
Endi hisobotga o'rtacha narxni ham qo'shamiz. Buning uchun AVG(narx) dan foydalanamiz. Esingizda bo'lsa, AVG har doim kasr son (float) qaytaradi va ba'zan juda uzun bo'lib ketadi. Shuning uchun uni ROUND(..., 2) bilan 2 xonagacha yaxlitlaymiz:
SELECT kategoriya, COUNT(*), SUM(ombor), ROUND(AVG(narx), 2)
FROM mahsulotlar
GROUP BY kategoriya
ORDER BY kategoriya;Natija — to'rt ustunli to'liq hisobot:
Elektronika|3|65|5766666.67
Kanstovar|2|700|5500.0
Kitoblar|1|100|50000.0
Mebel|2|55|525000.0Endi bitta so'rov har bir kategoriya haqida darrov uchta ko'rsatkich beradi: nechta mahsulot bor, qancha ombor zaxirasi bor va o'rtacha narxi qancha. Aynan shu — agregatlar va GROUP BY ning eng kuchli tomoni.
Eslatma:
5766666.67— bu Elektronikaning o'rtacha narxi:(5000000 + 12000000 + 300000) / 3 = 5766666.666...,ROUND(..., 2)uni5766666.67ga yaxlitlaydi. Boshqa guruhlarda yaxlitlangach.0ko'rinishida chiqyapti, chunki kasr qismi nolga teng.
Bu so'rovda bir vaqtning o'zida bir nechta qism ishlaydi. Ularning yozilish tartibini eslab qolish foydali:
SELECT — qaysi ustun va agregatlarni ko'rsatishni belgilaymiz (kategoriya, COUNT, SUM, ROUND(AVG(...)));FROM — qaysi jadvaldan olishni aytamiz (mahsulotlar);GROUP BY — qatorlarni guruhlarga bo'lamiz (kategoriya);ORDER BY — tayyor guruhlarni tartiblaymiz (kategoriya).Muhim:
GROUP BYbir nechta qator qaytaradi, shuning uchun natija aniq va takrorlanadigan bo'lishi uchun oxiriga doimoORDER BYqo'shing. Bu yerda kategoriyani alifbo tartibida chiqarish uchunORDER BY kategoriyaishlatdik.
Pastdagi kod oynasida mahsulotlar jadvali allaqachon yaratilgan va to'ldirilgan (ustunlar: id, nomi, kategoriya, narx, ombor). Sizning vazifangiz — har bir kategoriya uchun quyidagi uchta ko'rsatkichni bitta hisobotda chiqaring:
COUNT),SUM),AVG, 2 xonagacha yaxlitlangan).Natija kategoriya nomi bo'yicha alifbo tartibida bo'lsin.