MySQL показать записи по неделям - PullRequest
0 голосов
/ 04 марта 2011

привет, у меня есть таблица заказов. Я хочу выполнить запрос, который не будет возвращать ни одного заказа за последние 4 недели, если в течение недели не было заказов, должно быть указано, что 0 заказов не выполняются

ID | order_Date | amount
1  | 2011-03-01  | 10
2  | 2011-03-01  | 50
3  | 2011-02-24  | 60

select sum(amount) as total from orders group by WEEK(order_date,INTERVAL 3 Week)

спасибо

Ответы [ 3 ]

0 голосов
/ 04 марта 2011

давайте посмотрим на язык, который вы используете:

, который не вернет ни одного заказа за последние 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;

Я надеюсь, что это объяснение поможет вам принять методологию решения проблем, примененную здесь:)

0 голосов
/ 04 марта 2011
select sum(amount) as total from orders 
where 
order_date between date_sub(now(), interval 4 week) and 
date_sub(now(), interval 3 week)
union
select sum(amount) as total from orders 
where 
order_date between date_sub(now(), interval 3 week) and 
date_sub(now(), interval 2 week)
union
select sum(amount) as total from orders 
where 
order_date between date_sub(now(), interval 2 week) and 
date_sub(now(), interval 1 week)
union
select sum(amount) as total from orders 
where 
order_date between date_sub(now(), interval 1 week) and now();
0 голосов
/ 04 марта 2011
select monday,monday + interval 6 day as sunday,coalesce(a.total,0) as total from (
select curdate() - 
interval weekday(curdate()) day - interval tmp.digit * 1 week as monday             
from (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3
) as tmp ) as t 
left join (     select 
        week(order_date) as nweek, 
        sum(amount) as total
        from orders
        where order_date
        between 
        curdate() - interval weekday(curdate()) day - interval 3 week and
        curdate() + interval 6 - weekday(curdate()) day
        group by nweek order by null
       ) as a
on week(monday) = a.nweek   
group by a.nweek
order by monday desc

Результаты:

+------------+------------+--------+
| monday     | sunday     | total  |
+------------+------------+--------+
| 2011-02-28 | 2011-03-06 | 834312 |
| 2011-02-21 | 2011-02-27 | 818334 |
| 2011-02-14 | 2011-02-20 | 824032 |
| 2011-02-07 | 2011-02-13 | 695021 |
+------------+------------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...