Сгруппируйте payment по дате и вычислите SUM(sum) вместе с COUNT(). COUNT() считает строки платежей, включая строки, где сумма NULL, тогда как SUM такие значения пропускает.
Агрегация ежедневных сумм и числа платежей
Сгруппируйте payment по дате и вычислите SUM(sum) вместе с COUNT(*). COUNT(*) считает строки платежей, включая строки, где сумма NULL, тогда как SUM такие значения пропускает.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе данных имеется таблица payment, содержащая столбцы: user_id, date, sum. Требуется составить SQL‑запрос, который выдаст два показателя для каждой даты: общий объём средств и количество совершённых транзакций.
Ответ
Сгруппируйте payment по дате и вычислите SUM(sum) вместе с COUNT(). COUNT() считает строки платежей, включая строки, где сумма NULL, тогда как SUM такие значения пропускает.
Если date имеет тип DATE:
SELECT p.date AS payment_date,
SUM(p.sum) AS total_amount,
COUNT(*) AS payment_count
FROM payment AS p
GROUP BY p.date
ORDER BY p.date;
Если поле содержит timestamp, сначала получите календарный день в нужном часовом поясе и группируйте по нему. Даты без платежей не появятся: для них нужен календарь дат с LEFT JOIN. Для денег используйте точное представление, например NUMERIC или целые минимальные денежные единицы, не float.