按周编写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吗?
如果您有任何想法,请给我建议。
谢谢。
答案 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。