小飞外卖,数据统计部分sql思路详解

前言

本文是在开发毕业设计时,关于数据统计报表功能需求,思路整理。

用户统计

前端要求的数据: 是区间内日期字符串,用户总量字符串,新增用户量字符串。如下图

实现思路

  1. 计算出日期时间开始前的用户总量
  2. 计算出日期区间对应的每日用户新增量
  3. 那么当前日期的用户总量即为昨日总量+今日新增

代码实现解析

完整代码如下

scss 复制代码
@Override
public Result<UserReportVO> userStatistics(LocalDate begin, LocalDate end) {
    // 1.统计时间开启前,用户的总量
    Integer beginTotalUser = userMapper.getBeginTotalUser(begin);
    // 2.统计时间区间内每日用户增量   注: 若区间内有日期没有新增用户,则返回结果的日期不连续
    List<UserStatisticsDTO> newUsers = userMapper.countNewUser(begin,end);

    /*
      接下来通过逻辑封装数据返回给前端集合
     */

    // 3.初始化所需的数据结构, 即日期连续的每日用户新增量,与总量
    List<LocalDate> localDates = new ArrayList<>();
    List<UserStatisticsDTO> users = new ArrayList<>();
    users.add(new UserStatisticsDTO(begin, 0, 0));
    while (!end.equals(begin)) {
        begin = begin.plusDays(1);
        localDates.add(begin);
        users.add(new UserStatisticsDTO(begin, 0, 0));
    }
    //打印初始化后的结果
    users.forEach(t -> {
        log.info("当前日期{},当前日新增{},当日用户总数{}", t.getDate(), t.getNewUser(), t.getTotalUser());
    });

    // 4.将每日新增用户量的结果合并到所需的数据结构中
    Integer totalUser = beginTotalUser;
    for (UserStatisticsDTO dto : users){
        for (UserStatisticsDTO user : newUsers){
            //如果匹配到日期则进行赋值操作
            if (dto.getDate().equals(user.getDate())){
                //设置当前新增用户量
                dto.setNewUser(user.getNewUser());
                //更新当前的用户总量
                totalUser += user.getNewUser();
            }
        }
        //为了确保每个日期的用户总量都被统计到,所以需要写在循环外面
        dto.setTotalUser(totalUser);
    }
    // 此时所有数据都合并完毕, users中存放的就为,时间区间连续的,当日新增用户量数据,当日用户总数数据的集合

    //封装数据返回
    StringJoiner dateString = new StringJoiner(",");
    StringJoiner newUserString = new StringJoiner(",");
    StringJoiner totalUserString = new StringJoiner(",");
    for (UserStatisticsDTO user : users){
        dateString.add(user.getDate().toString());
        newUserString.add(user.getNewUser().toString());
        totalUserString.add(user.getTotalUser().toString());
    }
    UserReportVO userReportVO = new UserReportVO();
    userReportVO.setDateList(dateString.toString());
    userReportVO.setNewUserList(newUserString.toString());
    userReportVO.setTotalUserList(totalUserString.toString());
    return Result.success(userReportVO);
}

订单统计

需求:要求统计区间日期内,每日的有效订单数,每日的订单总数,区间内所有的有效订单,区间内订单总数。

实现思路:

  1. 查询区间内每日有效订单数, 使用group by实现
  2. 查询区间内每日订单总数, 使用group by实现
  3. 根据以上俩数据可求出区间内所有的有效订单数(对1.求和),区间内所有的订单总数(对2.求和)
  4. 订单完成率为有效订单总数/订单总数

销量统计

需求

实现思路:

  1. 连接订单表和订单明细表
  2. 根据商品名称分组, where条件为日期的区间, count(*) 查出每个商品的销量
  3. 根据销量降序排序
  4. 使用limt筛选出前10个
相关推荐
华仔啊1 分钟前
SpringBoot + MQTT 如何实现取货就走的智能售货柜系统
java·后端
SamDeepThinking2 分钟前
基于CompletableFuture的主子任务并行处理架构实战:多渠道账单并发导入性能提升5倍的技术方案
java·后端·excel
期待のcode3 分钟前
Springboot整合springmvc的自动装配
java·spring boot·后端
古城小栈4 分钟前
SpringBoot Web容器选型指南:Tomcat与Undertow技术对比及迁移实践
spring boot·后端·tomcat
悟能不能悟5 分钟前
springboot的controller中如何拿到applicatim.yml的配置值
java·spring boot·后端
0和1的舞者6 分钟前
《SpringBoot 入门通关指南:从 HelloWorld 到问题排查全掌握》
java·spring boot·后端·网络编程·springboot·开发·网站
考虑考虑7 分钟前
SpringBoot4中api版本控制
spring boot·后端·spring
Jul1en_11 分钟前
【Spring DI】Spring依赖注入详解
java·spring boot·后端·spring
Lisonseekpan17 分钟前
HTTP请求方法全面解析:从基础到面试实战
java·后端·网络协议·http·面试
无奈何杨27 分钟前
业务接入风控决策,挑战验证与结果同步
后端