GROUP BY va HAVING
099 daq
GROUP BY qatorlarni bir xil qiymat bo‘yicha guruhlarga ajratadi va har bir guruh uchun alohida hisoblaydi. «Har bir shahardan nechta talaba?», «har bir kategoriyada o‘rtacha narx?» — hammasi shu.
Qanday ishlaydi
Baza talabalarni shaharlar bo‘yicha «qoziqlarga» ajratadi, keyin har bir qoziqni sanaydi. Natijada har bir shahar — bitta qator.
Qoida
SELECT dagi har bir ustun yoki GROUP BY da bo‘lishi, yoki agregat ichida turishi kerak:
PostgreSQL bu qoidani doim qat’iy tekshiradi: qoidani buzsangiz — «must appear in the GROUP BY clause» xatosi.
HAVING — guruhlar uchun shart
WHERE qatorlarni guruhlashdan oldin filtrlaydi, HAVING esa guruhlarni keyin:
Ikkalasi birga:
Bajarilish tartibi
So‘rov shu tartibda yoziladi, baza ham deyarli shu tartibda bajaradi:
FROM— qaysi jadval;WHERE— qaysi qatorlar;GROUP BY— guruhlash;HAVING— qaysi guruhlar;SELECT— nimani ko‘rsatish;ORDER BY,LIMIT— tartib va cheklov.
Shuning uchun WHERE ichida COUNT(*) ishlatib bo‘lmaydi — u paytda guruhlar hali yo‘q.
Har bir buyurtma holati (status) bo‘yicha buyurtmalar sonini chiqaring: status va soni.
Kamida 4 ta mahsuloti bor brendlarni chiqaring: brand va mahsulotlar soni.
Har bir to‘lov usuli (method) bo‘yicha to‘lovlar amount yig‘indisini chiqaring.
Esda qoldiring
GROUP BY— guruhlab hisoblash;SELECTdagi oddiy ustunlarGROUP BYda bo‘lsin.WHERE— qatorlar uchun,HAVING— guruhlar uchun.- Tartib:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.