Условия задачи и вопрос тут, а мы делимся решением 👇
Правильный ответ: A (ставьте 🎉, если решили верно)
SELECT
category,
SUM(amount) AS total_revenue
FROM
orders
WHERE
order_date >= '2024-03-01'
AND order_date < '2024-04-01'
AND is_returned = FALSE
GROUP BY
category
ORDER BY
total_revenue DESC;
Почему верно:
➖ Фильтр по дате: >= '2024-03-01' AND < '2024-04-01' — включает весь март 2024, не включает апрель, надёжно для DATE и TIMESTAMP.
➖ Фильтр по возвратам: is_returned = FALSE — включает только невозвращённые, исключает TRUE и NULL.
➖ Группировка: GROUP BY category — по условию задачи.
➖ Сортировка: ORDER BY total_revenue DESC — по убыванию выручки.
➖ Результат соответствует задаче.
B — ошибка: неправильное использование HAVING
SELECT
category,
SUM(amount) AS total_revenue
FROM
orders
WHERE
order_date >= '2024-03-01'
AND order_date < '2024-04-01'
GROUP BY
category
HAVING
is_returned = FALSE
ORDER BY
total_revenue DESC;
➖ Ошибка: HAVING is_returned = FALSE — неправильно, потому что HAVING используется только для агрегатных функций (например, HAVING SUM(amount) > 1000). is_returned — обычное поле, а не агрегат.
➖ СУБД (например, PostgreSQL) выдаст ошибку, запрос не выполнится, и задача не будет решена.
C — ошибка. Здесь допущены логические и смысловые ошибки
SELECT
category,
SUM(amount) AS total_revenue
FROM
orders
WHERE
EXTRACT(MONTH FROM order_date) = 3
AND is_returned IS DISTINCT FROM TRUE
GROUP BY
category
ORDER BY
total_revenue DESC;
➖ Нет фильтра по году: EXTRACT(MONTH FROM order_date) = 3 — включает все марты всех лет, а не только 2024.
➖ Неправильная обработка NULL: is_returned IS DISTINCT FROM TRUE — включает NULL, т. е. заказы, статус которых неизвестен, как если бы они не были возвращены.
➖ NULL IS DISTINCT FROM TRUE — TRUE-строка попадает в сумму.
➖ Результат: завышенная выручка, включая заказы из других лет и с неизвестным статусом.
📊 Simulative