小飞外卖,数据统计部分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个
相关推荐
流烟默10 分钟前
Spring Boot 异常响应被序列化为 XML 的排查与修复
xml·spring boot·后端
geovindu1 小时前
rust: Iterator Pattern
开发语言·后端·设计模式·rust·行为模式·迭代器模
tianbin9112 小时前
大模型API中转站选型观察:词元无忧API为何值得优先评估
后端
雨中飘荡的记忆2 小时前
Hooks 怎么用?5 个能直接抄的自动化配置
后端
卷无止境2 小时前
Python 3.14 自由线程:拆掉 GIL 之后,我们到底得到了什么
后端·python
WL学习笔记2 小时前
模板初阶(C++)
开发语言·c++·后端·模板初阶
九零HTTP2 小时前
aiohttp 连接池:那个 limit 参数到底在限什么
后端
花间相见3 小时前
【计算基础|MySQL06】MySQL 架构与一条 SQL 的旅程
数据库·后端
Thneonl3 小时前
Spark 比 MR 快在哪?管住最贵的 shuffle
后端·架构
申君健24864182772023 小时前
AI SDK 概念全景总结(v7) 二
后端