1.4Kпросмотров
93.7%от подписчиков
14 января 2026 г.
questionScore: 1.5K
Развилка в SQL: WHERE или агрегация с CASE? Есть таблица с событиями/заказами, где есть: ⭕️dt — string в формате YYYY-MM-DD (и ещё это partition key)
⭕️product — название продукта, иногда бывает 'unknown' Нужно по месяцам посчитать, сколько раз встречался unknown продукт. И тут два логичных решения — но они дают разный результат. Вариант 1 — вывести все месяцы и посчитать unknown
(включая месяцы, где unknown = 0) select substr(dt, 1, 7) as ym, sum(case when product = 'unknown' then 1 else 0 end) as unknown_cnt
from events
where dt >= '2025-01-01' and dt < '2026-01-01'
group by 1
order by 1; Ты увидишь все месяцы, которые есть в данных, и в них unknown_cnt будет 0, если unknown не встречался. Чаще всего для бизнеса это и есть верный вариант. Вариант 2 — отфильтровать unknown в WHERE
(и потом агрегировать) select substr(dt, 1, 7) as ym, count(*) as unknown_cnt
from events
where product = 'unknown' and dt >= '2025-01-01' and dt < '2026-01-01'
group by 1
order by 1; Но тут аккуратно - если в данных нет ни одной строки с unknown за период — запрос вернёт 0 строк. А потом вопрос к тебе "А где месяцы?" Что выбрать? 🔴Если нужны месяцы + нули → Вариант 1 (CASE внутри SUM/COUNT)
🔴Если нужны только месяцы, где unknown реально был → Вариант 2 (WHERE) ⚠️ Если dt — partition column и он string YYYY-MM-DD, то для фильтра по диапазону лучше не оборачивать dt в функции. Какой вариант вы бы выбрали по умолчанию в рабочем отчёте?
🔥 — A (месяцы + нули)
👍 — B (только где unknown был) Кстати, на неделю включил скидку на мои SQL-курсы (в закрепе). Если хочется больше практики — присоединяйся.