# SQL GROUP BY — guruhlab hisoblash

> SQL GROUP BY bilan qatorlarni guruhlash va har guruh uchun hisob chiqarish: COUNT va SUM, HAVING bilan guruhlarni filtrlash hamda GROUP BY va JOIN birga.

Manba: https://learncode.uz/sql/group-by/
Sana: 2026-06-14

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:

```sql
SELECT turi, COUNT(*) AS soni FROM mahsulotlar GROUP BY turi;
```

O'zingiz ishga tushirib ko'ring — so'rovni tahrirlashingiz ham mumkin:

```sql
SELECT turi, COUNT(*) AS soni FROM mahsulotlar GROUP BY turi;
```

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.

> **Atama**
>
> **Agregat funksiya** — bir guruhdagi ko'p qatordan **bitta** natija
> chiqaradigan funksiya: `COUNT` (sanaydi), `SUM` (qo'shadi), `AVG` (o'rtacha).
> `GROUP BY` bo'lmasa, ular butun jadvalni bitta guruh deb hisoblaydi. Bularni
> keyingi darsda batafsil ko'ramiz.

## Guruh bo'yicha yig'indi

`SUM` bilan har guruhdagi qiymatlarni qo'shamiz. Har turda jami nechta dona
mahsulot borligini topamiz:

```sql
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:

```sql
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 |

> **Boshlovchilar tez-tez yanglishadigan joy**
>
> `WHERE` va `HAVING` farqi: `WHERE` guruhlashdan **oldin** alohida qatorlarni
> filtrlaydi; `HAVING` esa guruhlashdan **keyin** guruhlarni filtrlaydi.
> Agregat (`COUNT`, `SUM`) bo'yicha filtrlash faqat `HAVING` da mumkin —
> `WHERE COUNT(*) > 1` ishlamaydi.

## GROUP BY va JOIN birga

`GROUP BY` ko'pincha [`JOIN`](https://learncode.uz/sql/join) bilan ishlatiladi. Har mijoz
nechta buyurtma qilganini bilaylik:

```sql
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.

<Callout type="example" title="O'zingizni sinab ko'ring">
Namuna bazangizda sinang:

```sql
SELECT turi, COUNT(*) AS soni FROM mahsulotlar
GROUP BY turi ORDER BY soni DESC;
```

Bu har turdagi mahsulot sonini hisoblab, ko'pdan kamga tartiblaydi.
`GROUP BY`, `COUNT` va `ORDER BY` birga ishlayotganiga e'tibor bering.
Endi `SUM(soni)` bo'yicha ham tartiblab ko'ring.
</Callout>

## Amaliy mashq

Guruhlab hisoblang:

1. Har `turi` bo'yicha mahsulotlar sonini chiqaring;
2. `SUM(soni)` bilan har toifadagi jami donani hisoblang;
3. `AVG(narx)` bilan o'rtacha narxni qo'shing;
4. natijani `ORDER BY` bilan songa qarab tartiblang;
5. `GROUP BY` ni olib tashlang — qanday xato yoki natija chiqdi?
6. Boshqa jadvalda sinang: `mijozlar` ni `shahar` bo'yicha guruhlab, har
   shahardagi mijozlar sonini chiqaring.

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**); `WHERE` esa
  qatorlarni (guruhlashdan **oldin**).
- `GROUP BY` ko'pincha `JOIN` bilan ishlatiladi — masalan har mijoz
  bo'yicha hisob.
- Tartib: `... WHERE ... GROUP BY ... HAVING ... ORDER BY ...`.

Keyingi darsda [agregat funksiyalar](https://learncode.uz/sql/agregat-funksiyalar) — `COUNT`,
`SUM`, `AVG`, `MIN`, `MAX` ni batafsil ko'ramiz. Bu SQL Boshlang'ich
bo'limining yakuniy darsi.
