关于SQL group的一些问题

时间:2011-02-26 14:16:06

标签: mysql sql group-by

按周编写SQL组时遇到一些问题。

我有一个名为order的MySQL表。

在这个实体中,有几个属性,称为“order_id”,“order_date”,“amount”等。

我想制作一张表格,以显示过去7天订单销售额的统计数据。

我认为首先我应该获得今天的价值。

因为我使用Java Server Page,所以代码如下:

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;

然后,我需要使用group by语句来计算过去7天总销售额的总和。

像这样:

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

我这里有问题。在我的SQL中,将显示所有order_date。

如何修改此SQL,以便仅显示过去7天的订单销售金额?

除此之外,我发现原始SQL中存在问题。

也就是说,如果当天没有销售,则不会显示任何结果。

当然,我知道ResultSet不允许在我的SQL中返回空值。

我只是想知道我是否需要过去的7个订单销售,即使金额是0美元,

我可以使用其他方法来显示0吗?

如果您有任何想法,请给我建议。

谢谢。

3 个答案:

答案 0 :(得分:1)

通常,使用脚本或存储过程创建包含所有日期的日历表。

但是,如果您愿意,可以使用单个查询创建一个日期很少的表(在您的上个星期的日期中)。

这是一个例子:

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

希望它有所帮助。问候。

答案 1 :(得分:0)

要回答您的问题“如何修改此SQL,以便仅显示过去七天的订单销售金额?”

通过向其添加where子句来修改SQL语句:

order_date> = @ date_7days_ago

可以在语句之前设置此@ date_7days_ago日期变量的值:

选择@ date_7days_ago = dateadd(dd,-7,getdate())

在查询中添加where子句将仅返回订单日期在过去七天内的那些记录。

希望这有帮助。

答案 2 :(得分:0)

你可以试试这个:

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

这将获得过去7天内的订单数量,如果没有,则为0。