Saytdan foydalanishda muammoga duch kelsangiz, qo'llab-quvvatlash xizmatiga murojaat qiling: @fast_support_admin
Agregatsiyalar3 daqiqa o'qish

GROUP BY asoslari — guruhlab hisoblash

GROUP BY qatorlarni bir xil qiymat bo'yicha guruhlab, har bir guruh uchun COUNT, SUM, AVG hisoblaydi. SELECT dagi ustunlar qoidasini va COUNT(*) bilan COUNT(ustun) farqini ko'ramiz.

Hisobotlarning deyarli hammasi bitta savolga borib taqaladi: "har bir … bo'yicha nechta / qancha?". Har bir shahar bo'yicha buyurtmalar soni, har bir kurs bo'yicha o'rtacha baho, har bir oy bo'yicha tushum. Bularning hammasi GROUP BY bilan yechiladi.

Jadval: sales

idregionproductamount
1ToshkentTelefon3000
2ToshkentNoutbuk9000
3Farg'onaTelefon2500
4ToshkentTelefon3200
5Farg'onaQuloqchinNULL

Bitta guruh — bitta qator

SELECT region,
       COUNT(*)    AS sales_count,
       SUM(amount) AS total,
       AVG(amount) AS avg_amount
FROM sales
GROUP BY region;
regionsales_counttotalavg_amount
Toshkent3152005066.67
Farg'ona225002500.00

GROUP BY region jadvalni ikki "qop"ga ajratdi. Agregat funksiyalar har bir qop ichida ishladi va har bir qopdan bitta qator chiqdi.

Diqqat qiling: Farg'onada 2 ta sotuv bor, lekin o'rtacha 2500. AVG va SUM NULL qiymatlarni hisobga olmaydi — o'rtacha faqat bitta qiymatdan olindi.

COUNT(*) va COUNT(ustun) farqi

  • COUNT(*) — guruhdagi barcha qatorlar soni.
  • COUNT(amount) — amount NULL bo'lmagan qatorlar soni.
SELECT region, COUNT(*) AS rows_count, COUNT(amount) AS with_amount
FROM sales
GROUP BY region;
regionrows_countwith_amount
Toshkent33
Farg'ona21

Takrorlanmas qiymatlar soni kerak bo'lsa — COUNT(DISTINCT product).

Bir nechta ustun bo'yicha guruhlash

SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY region, product
ORDER BY region, total DESC;

Endi guruh — (region, product) jufti: "Toshkent + Telefon" alohida, "Toshkent + Noutbuk" alohida.

Eng ko'p uchraydigan xato: guruhlanmagan ustun

Noto'g'ri yondashuv
SELECT region, product, SUM(amount)
FROM sales
GROUP BY region;

PostgreSQL xato beradi: column "sales.product" must appear in the GROUP BY clause or be used in an aggregate function. Toshkent guruhida ikki xil mahsulot bor — bitta qatorga qaysi birini yozishni baza bilmaydi.

Qoida oddiy: SELECT dagi har bir ustun yoki GROUP BY da bo'lsin, yoki agregat ichida.

To'g'ri yechim
SELECT region, COUNT(DISTINCT product) AS products, SUM(amount) AS total
FROM sales
GROUP BY region;

Xulosa

  • GROUP BY — "har bir … bo'yicha" savollari uchun; har bir guruhdan bitta qator.
  • SUM, AVG, COUNT(ustun) — NULL ni o'tkazib yuboradi; COUNT(*) — hamma qatorni sanaydi.
  • SELECT dagi ustun yoki GROUP BY da, yoki agregat ichida bo'lishi shart.
  • Guruhlarni filtrlash kerak bo'lsa — HAVING (alohida darslikda).

Endi o'zingiz yechib ko'ring

O'rganganingizni mustahkamlang — so'rovingiz brauzerda darhol tekshiriladi.

Telegram'da muhokama qilish