Нужно посчитать средний дневной доход: сначала SUM(amount) по каждому дню, затем AVG по дням. Какой запрос соответствует этой логике?

ASELECT AVG(day_revenue) FROM (SELECT pay_date, SUM(amount) AS day_revenue FROM payments GROUP BY pay_date) d: два уровня агрегации
BSELECT AVG(SUM(amount)) FROM payments GROUP BY pay_date: попытка вложить агрегат в агрегат напрямую без подзапроса
CSELECT AVG(amount) FROM payments: одно среднее по всем платежам без предварительной группировки по дате
DSELECT SUM(amount) / COUNT(*) FROM payments: сумма всех сумм делится на число всех строк без разреза по дням
Правильный ответ. Для «агрегации над агрегацией» удобно вынести первый уровень в подзапрос в FROM (или CTE), а затем агрегировать второй раз.

Разбор

Средний дневной доход — это среднее по дням, а не среднее по платежам. Поэтому сначала нужно получить таблицу «день → выручка дня» (через GROUP BY pay_date), и только потом считать AVG по этим дневным суммам. Подзапрос в FROM делает уровни агрегации явными и уменьшает вероятность перепутать метрику. Вариант с AVG(SUM(...)) без подзапроса не работает; AVG(amount) и SUM/COUNT дают среднее по платежам, а не по дням.

Проверь себя · 1/3разбор после ответа
В отчёте нужно посчитать выручку по странам пользователей только по оплаченным заказам за период, причём шаг «оплаченные за период» используется ещё в трёх соседних метриках. Какой подход обычно делает запрос проверяемее и позволяет переиспользовать фильтрацию?
Тренировать SQL в Telegram

Ещё вопросы по теме «Подзапросы и CTE»