统计近一周每天的销售额
select date_format(create_at,'%Y-%m-%d') as 'date', IFNULL(SUM(amount),0) as 'dayAmount'
from order_pay_trace
where create_at >= date(now()) - interval 6 day
group by day(create_at);
统计近三个月每个月的销售额
这里在限制条件处先获得四个月的数据,因为最前面的月份不是满月的销售额,故舍去
select month(create_at) as 'month', IFNULL(SUM(amount),0) as 'monthAmount'
from order_pay_trace
where create_at >= date(now()) - interval 3 month AND date_format(create_at,'%Y-%m') <> date_format(date(now()) - interval 3 month,'%Y-%m')
group by month(create_at);
统计指定月份的销售额(此处以统计当前日期前一个月的销售额为例)
select date_format(date(now()) - interval 1 month,'%Y-%m') as 月份,IFNULL(SUM(amount),0) as 销售额
from order_orders
where date_format(create_at,'%Y-%m') = date_format(date(now()) - interval 1 month,'%Y-%m')
注意:上述sql语句也有一些bug,比方说如果使用第一条sql语句来查询当前时间内近七天的每天的销售额,因为group by分组是按照day(create_at)的日期来分的,若其中某一天没有创建订单,自然也不会有create_at,这样查出来的数据就会缺失这一天的销售额数据。
解决方案:在java代码中新建一个List<Map<String, Object>> newMapList = new ArrayList<>();集合,然后用java代码获取当前日期及其当前日期近一周内的所有日期,用java代码获得的日期和从sql中查出来的日期循环对比,若sql查出来的日期存在,那么将sql查出来的销售额赋值,若不存在默认销售额为0,最后将java代码中查出来的近七天的日期和对应的销售额存入一个map集合中一起加入到list集合中即可。
List<Map<String, Object>> newMapList = new ArrayList<>();
//获得近七天的日期和对应日期的日销售额
List<Map<String, Object>> mapList = this.baseMapper.selectLastSevenDaysAmount();
//处理日销售额格式 分转元
for (Map<String, Object> map : mapList) {
BigDecimal dayAmount = (BigDecimal) map.get("dayAmount");
Integer intAmount = dayAmount.intValue();
map.put("dayAmount", MoneyUtils.changeF2YDouble(intAmount));
}
//此处为了处理数据缺失导致的问题,比如某一天没有订单创建,那么sql语句中按照日期分组后就没有该日期这一组,自然也会缺失这一天的销售额
for (int i = 0; i < 7; i++) {
HashMap<String, Object> newMap = new HashMap<>();
//获得近七天的日期date
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
calendar.add(Calendar.DATE,-i);
String date= sdf.format(calendar.getTime());
Double dayAmount = 0.0;
//将获得的日期和从数据库查询的日期作比较,若存才则将数据库得到的销售额赋值,若不存在则默认该天销售额为0.0
for (Map<String, Object> map : mapList) {
if (date.equals(map.get("date"))) {
dayAmount = (Double) map.get("dayAmount");
}
}
newMap.put("date", date);
newMap.put("dayAmount", dayAmount);
newMapList.add(newMap);
}
return newMapList;
}