Към съдържанието
wannacode

HAVING: условие за групите

Накратко: HAVING филтрира групите след GROUP BY с условие върху агрегатна функция, например SUM(total) > 100, което WHERE не може, защото работи преди групирането.

Проблем

Картата за лоялност

Магазинът пуска карта за лоялност: получават я клиентите с повече от 3 поръчки. Знаеш как да преброиш поръчките на всеки клиент с GROUP BY customer_id. Излизат 18 реда. Как да оставиш само тези с повече от 3?

WHERE не става: той гледа отделните поръчки, а броят е на целия клиент.

Идеята

HAVING

HAVING е условие за групите. Пише се след GROUP BY и в него може да има обобщение:

SQLбаза: магазин

Четирима клиенти. Групите се правят, броят се смята за всяка, а HAVING оставя само групите, за които условието е вярно.

Пробвай

Големите поръчки

За безплатната доставка ни трябват поръчките за над 30 €. Полето показва стойността на всяка поръчка. Остави само тези над 30 €.

SQLбаза: магазин

Виж го

SUM в WHERE

Първият опит на почти всеки е със WHERE. Пусни го:

SQLбаза: магазин

SQLite спира с „misuse of aggregate“: обобщение на място, където не му е мястото. В WHERE базата гледа редовете един по един. Групи още няма, няма и какво да събира.

Идеята

WHERE и HAVING заедно

Двете не си пречат, а работят на различно място:

  • WHERE филтрира редовете преди групите;
  • HAVING филтрира групите след тях.

Картата за лоялност без отказаните поръчки:

SQLбаза: магазин

Клиент 7 отпадна. Той има 4 поръчки, но една е отказана. WHERE я махна, преди да се направят групите, и в неговата група останаха 3.

Условие, което гледа отделния ред (status, дата, цена), пиши в WHERE. То намалява редовете, които базата трябва да групира. В HAVING остави само условията върху обобщения.

Пробвай

Само по веднъж

Маркетингът иска да пише на клиентите, които през 2026 г. са поръчали точно веднъж. Броят се всички поръчки, и отказаните. Покажи customer_id и броя на поръчките им от 2026 г.

SQLбаза: магазин

Упражнение

Две справки

1. Доставчиците дават отстъпка за продуктите, от които продаваме много. Кои продукти са продадени в поне 15 бройки?

Покажи product_id и продадените бройки на продуктите с поне 15 продадени бройки.

SQLбаза: магазин

2. През кои месеци е имало поне 6 поръчки? Там ще трябват повече хора в склада.

Покажи месеца (година-месец) и броя на поръчките за месеците с поне 6 поръчки.

SQLбаза: магазин

Тест

Провери се

1. Кое условие намира поръчките за над 30 €?
2. Кога се прилага WHERE?
3. Клиент 7 има 4 поръчки, една от тях е отказана. Излиза ли той с WHERE status <> 'cancelled' … HAVING COUNT(*) > 3?
4. Какво значи грешката „misuse of aggregate function SUM()“?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·