Data Analyst Professional · Модуль 4 · Урок 14 із 51
CASE: прозорі бізнес-правила у SQL
CASE перетворює умови на категорію або значення. Він читається зверху вниз і повертає перший збіг, тому порядок правил, coverage, взаємовиключність і явний ELSE є частиною коректності.
Searched CASE для діапазонів і складних умов
CASE
WHEN net_revenue >= 100000 THEN 'enterprise'
WHEN net_revenue >= 20000 THEN 'mid_market'
WHEN net_revenue >= 0 THEN 'small'
ELSE 'INVALID'
END AS revenue_bandВищий threshold стоїть першим. Якби >= 0 був першим, усі невід’ємні values отримали б small, бо CASE зупиняється на першому TRUE.
Simple CASE для точних значень
CASE status
WHEN 'paid' THEN 'completed'
WHEN 'shipped' THEN 'completed'
WHEN 'cancelled' THEN 'cancelled'
ELSE 'other_or_unknown'
END AS status_groupSimple CASE порівнює один expression із точними values. Для ranges, NULL або кількох полів використовуйте searched CASE. WHEN NULL у simple CASE не замінює WHEN status IS NULL.
Якість rule set
Один row не повинен логічно належати до кількох категорій, якщо порядок не є явним пріоритетом.
ELSE показує unknown/other/invalid, а не мовчки прирівнює їх до основної групи.
Threshold, owner, effective date і version мають бути задокументовані.
Перевірте значення точно на межі, одразу нижче/вище, NULL і invalid.
Conditional aggregation
SELECT
channel,
COUNT(*) AS orders,
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_orders,
SUM(CASE WHEN status = 'completed' THEN net_amount ELSE 0 END) AS completed_revenue
FROM analytics.orders
GROUP BY channel;У PostgreSQL також є FILTER (WHERE ...), але CASE залишається поширеним і переносимим патерном. Важливо, щоб ELSE 0/NULL відповідав denominator і metric definition.
Коли CASE треба замінити rule table
| CASE доречний | Rule table краща |
|---|---|
| 3–5 стабільних правил у конкретному query | десятки mappings або часті зміни |
| технічна класифікація з owner | business taxonomy з effective dates |
| правила легко покрити tests | потрібні governance, audit history і non-developer editing |
Rule table має власний унікальний key, version/effective dates і перевірку overlap. JOIN до неї також потребує cardinality audit.
Практика: test matrix
- Запишіть категорії, порядок і business owner.
- Створіть test rows для кожної boundary, NULL і invalid value.
- Порахуйте distribution категорій та частку ELSE.
- Переконайтеся, що rule set не має небажаних overlaps/gaps.
- Якщо правил багато, винесіть їх у versioned mapping table.
Офіційна довідка
Готовність до тесту
Ви знаєте first-match semantics, правильно впорядковуєте ranges, робите ELSE видимим і тестуєте межі та distribution.
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.