SQL: Условная агрегация и COUNT(DISTINCT) — Все заказы и отдельные метрики крупных оплат
Практическая задача по SQL на тему «Условная агрегация и COUNT(DISTINCT)». В условии приведены схема таблиц, ограничения данных, имена столбцов результата и порядок сортировки. Напишите один SELECT или WITH-запрос для SQLite. Перед проверкой продумайте пустой результат, повторяющиеся строки и границы диапазонов, если они встречаются в условии. Проверяется результат запроса, поэтому допустима эквивалентная реализация. Сначала решите задачу самостоятельно; продолжение практики доступно в полном курсе продвинутого SQL.
Все заказы и отдельные метрики крупных оплат
Что уже дано
Уже заполнена orders(order_id INTEGER PRIMARY KEY,client_id INTEGER NOT NULL,order_date TEXT NOT NULL,status TEXT NOT NULL,amount INTEGER NOT NULL). ID положительные INTEGER; order_id уникален. order_date — корректная дата YYYY-MM-DD без времени. status строго paid, new либо cancelled. amount — целые копейки от 0 до 2 000 000 000, без NULL. До 1000 строк; суммы помещаются в 64-битный INTEGER. Повторение client_id, даты или суммы не делает разные заказы дублями.
Что нужно сделать
Для каждого client_id, встречающегося в orders, посчитайте total_orders — все заказы, paid_orders — число paid-заказов с amount >= 1000, paid_sum — сумму только таких заказов и distinct_paid_days — число различных дат только таких заказов. total_orders включает все заказы независимо от статуса и суммы. При отсутствии подходящих paid-заказов три специализированных показателя равны 0; сам клиент остаётся в отчёте.
Ввод и вывод
Отправьте один SELECT или WITH-запрос; stdin и печать не используются. Ровно 5 столбцов в указанном порядке и с этими именами: client_id, total_orders, paid_orders, paid_sum, distinct_paid_days. Все столбцы — INTEGER без NULL. Сортировка: client_id ASC. Пустая orders даёт пустой результат. В тестовых результатах разделитель |, NULL — пустое поле. Допускается любой эквивалентный запрос.
Пример
- Подготовка данных
INSERT INTO orders VALUES (1,10,'2026-01-01','paid',1000),(2,10,'2026-01-01','paid',1000),(3,10,'2026-01-02','paid',2000),(4,10,'2026-01-03','new',5000),(5,20,'2026-01-01','cancelled',4000),(6,10,'2026-01-03','paid',999),(7,20,'2026-01-04','paid',999);
- Вывод
10|5|3|4000|2 20|2|0|0|0
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- SQL: Агрегация, оконные вычисления и фильтрация — Категории-лидеры и доля в продажах
- SQL: SELF JOIN и поиск уникальных пар — Пары с несколькими общими проектами
- SQL: Календарная таблица и пропущенные даты — Непрерывный отчёт о звонках
- SQL: Объединение перекрывающихся интервалов — Объединённая занятость внутри отчётного окна
- SQL: Подсчёт одновременно активных интервалов — Максимальное число занятых столов
- SQL: EXPLAIN QUERY PLAN в SQLite — Сводка ошибок и их доля по сервисам
