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 · SQLite

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи