小飞外卖,数据统计部分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个
相关推荐
2401_8576100321 分钟前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端
背水3 小时前
初识Spring
java·后端·spring
晴天飛 雪3 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql
weixin_537590453 小时前
《Spring boot从入门到实战》第七章习题答案
数据库·spring boot·后端
AskHarries3 小时前
Spring Cloud Gateway快速入门Demo
java·后端·spring cloud
Qi妙代码4 小时前
MyBatisPlus(Spring Boot版)的基本使用
java·spring boot·后端
宇宙超级勇猛无敌暴龙战神4 小时前
Springboot整合xxl-job
java·spring boot·后端·xxl-job·定时任务