当前位置:   article > 正文

sql统计近三个月每月的销售额,统计近一周每天的销售额_sql统计近十五天以来,每一天的订单成交金额

sql统计近十五天以来,每一天的订单成交金额

统计近一周每天的销售额

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);
  • 1
  • 2
  • 3
  • 4

统计近三个月每个月的销售额
这里在限制条件处先获得四个月的数据,因为最前面的月份不是满月的销售额,故舍去

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);
  • 1
  • 2
  • 3
  • 4

统计指定月份的销售额(此处以统计当前日期前一个月的销售额为例)

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')
  • 1
  • 2
  • 3

注意:上述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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/950316
推荐阅读
相关标签
  

闽ICP备14008679号