давайте посмотрим на язык, который вы используете:
, который не вернет ни одного заказа за последние 4 недели
здесь вы объявляете условие, при котором строки должны учитываться в общей сумме. такие условия выражаются в виде «где» в sql. так что наше предложение "where" должно в этом случае сравнивать дату заказа и видеть, что оно находится в пределах определенного интервала.
Теперь вопрос в том, означает ли 4 недели в вашем случае «эту неделю и три недели до этой недели» или «сегодня и 27 дней до этого дня». проще всего использовать рассуждения «27 дней», так что я воспользуюсь этим! Итак, наш критерий заключается в том, что дата заказа (находится в столбце order_Date) должна быть после (или больше, чем) дня, то есть 27 дней до сегодняшнего дня. это означает, что нам нужно рассчитать день, который за 27 дней до этого дня. мы делаем это с помощью функции SUBDATE и функции CURDATE. вот только предложение "где":
WHERE
order_Date > SUBDATE(CURDATE(), INTERVAL 27 DAY)
таким образом, мы можем найти все заказы, которые мы хотим сложить вместе. вот запрос, который перечисляет все заказы, которые мы хотим:
SELECT
*
FROM
orders
WHERE
order_Date > SUBDATE(CURDATE(), INTERVAL 27 DAY);
теперь нам нужно сложить их в одну строку результатов! Для этого нам нужно сгруппировать полученные строки в одну, а затем суммировать все суммы. но «группировать по» группирует только те строки, в которых выбранный столбец для группировки имеет одинаковое значение. и нет никакой гарантии, что в строках будет такой столбец. поэтому мы создадим его в части запроса SELECT.
SELECT
amount,
1 AS column_to_group_by
FROM
orders
WHERE
order_Date > SUBDATE(CURDATE(), INTERVAL 27 DAY);
теперь мы можем группировать по столбцу column_to_group_by.
SELECT
amount,
1 AS column_to_group_by
FROM
orders
WHERE
order_Date > SUBDATE(CURDATE(), INTERVAL 27 DAY)
GROUP BY
column_to_group_by;
результат теперь совершенно бесполезен, так как он показывает только сумму первой строки таблицы. но теперь мы можем суммировать все суммы и таким образом получить желаемый ответ!
SELECT
SUM(amount),
1 AS column_to_group_by
FROM
orders
WHERE
order_Date > SUBDATE(CURDATE(), INTERVAL 27 DAY)
GROUP BY
column_to_group_by;
Я надеюсь, что это объяснение поможет вам принять методологию решения проблем, примененную здесь:)