2011-02-26 53 views
1

我在按周编码SQL组时遇到了一些问题。有关SQL组的一些问题

我有一个名为order的MySQL表。

在这个实体中,有几个属性,称为“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?

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

谢谢。

回答

0

要回答你的问题:“我怎么能修改此SQL,这样只能显示过去七天内订单销售金额?”

其中order_date的> = @ date_7days_ago

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

选择

通过添加where子句来修改它的SQL语句@ date_7days_ago = DATEADD(DD,-7,GETDATE())

并称,where子句的查询将返回只记录其订单日期在过去七天。

希望这会有所帮助。

+0

由于我通常在SQL存储过程中执行此操作,所以我忘记提及建议您使用存储过程而不是文本语句。 – 2011-02-26 14:44:48

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,如果什么都没有。

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 

希望它帮助。问候。

+0

对不起。我犯了一个错误。由于加入,结果加倍。我必须找到解决这个问题的办法。 – 2011-02-27 23:04:09

+0

我修改了查询。现在它可以工作。但是如果有人能够解决这个问题,而没有“/ 2坏技巧”,我想知道它。 – 2011-02-27 23:17:13

+0

你确定你需要'/ 2'吗?我在SQL Server上运行你的代码,没有它就得到了预期的结果。 '2011-02-27 \t 300','2011-02-26 \t 0' ...'2011-02-24 \t 200' ...'2011-02-22 \t 65' .... – 2011-02-27 23:33:45