Некоторые вопросы по SQL группируются по неделям - PullRequest
1 голос
/ 26 февраля 2011

У меня есть некоторые проблемы при кодировании группы SQL по неделям.

У меня есть таблица MySQL с именем order.

В этой сущности есть несколько атрибутов, называемых order_id, order_date',' сумма 'и т. д.

Я хочу составить таблицу для отображения статистики объема продаж за последние 7 дней.

Думаю, сначала мне нужно получить значение сегодня.

Поскольку я использую страницу сервера Java, код выглядит следующим образом:

Calendar cal = Calendar.getInstance();
int day = cal.get(Calendar.DATE);
int Month = cal.get(Calendar.MONTH) + 1;
int year = cal.get(Calendar.YEAR);
String today = year + "-" + Month + "-" + day;

, затем мне нужно использовать группирование по заявке для расчета суммы сумм продаж за последние 7 дней.

вот так:

    ResultSet rs=statement.executeQuery("select order_date, SUM(amount) " + 
    "from `testing`.`order` GROUP BY order_date");

У меня проблема здесь.В моем SQL будут отображаться все order_date.

Как я могу изменить этот SQL, чтобы отображать только сумму продажи заказа за последние семь дней?

Кроме того, я обнаружил проблему в своем исходном SQL.

То есть, если в этот день нет продаж, результаты не будут отображаться.

Конечно, я знаю, что ResultSet не позволяет возвращать нулевые значения в моем SQL.

Я просто хочу знать, нужны ли мне последние 7 заказов на продажу, даже если сумма составляет 0 долларов,

Могу ли я использовать другие способы, чтобы показать 0?

Пожалуйста, дайте мнеСоветы, если у вас есть идея.

Спасибо.

Ответы [ 3 ]

1 голос
/ 28 февраля 2011

Обычно это происходит с помощью скрипта или с помощью хранимой процедуры таблицы календаря со всеми датами.

Однако, если вы предпочитаете, вы можете создать таблицу с несколькими датами (в вашем случае даты прошлой недели)с одним запросом.

Это пример:

create table orders(
id int not null auto_increment primary key,
dorder date,
amount int
) engine = myisam;

insert into orders (dorder,amount)
values (curdate(),100),
       (curdate(),200),
       ('2011-02-24',50),
       ('2011-02-24',150),
       ('2011-02-22',10),
       ('2011-02-22',20),
       ('2011-02-22',30),
       ('2011-02-22',5),
       ('2011-02-19',10);

select t.cdate,sum(coalesce(o.amount,0)) as total 
from (
select curdate() - 
interval tmp.digit * 1 day as `cdate`
from (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 union all
select 7 ) as tmp) as t
left join orders as o
on t.cdate = o.dorder and o.dorder >= curdate() - interval 7 day
group by t.cdate
order by t.cdate desc

Надеюсь, что это поможет.С уважением.

0 голосов
/ 26 февраля 2011

Вы можете попробовать использовать это:

ResultSet rs = statement.executeQuery(
  "SELECT IFNULL(SUM(amount),0) 
  FROM table `testing`.`order`
  WHERE order_date >= DATE_SUB('" + today + "', INTERVAL 7 DAY)"
);

Это даст вам количество заказов, сделанных за последние 7 дней, и 0, если их не было.

0 голосов
/ 26 февраля 2011

Чтобы ответить на ваш вопрос «Как я могу изменить этот SQL, чтобы отображать только сумму продажи заказа за последние семь дней?»

Измените оператор SQL, добавив к нему предложение where:

Где order_date> = @ date_7days_ago

Значение этой переменной даты @ date_7days_ago может быть установлено перед вашим утверждением:

Выберите @ date_7days_ago = dateadd (дд, -7, getdate ())

Добавление пункта where к вашему запросу будет возвращать только те записи, чья дата заказа указана за последние семь дней.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...