小飞外卖,数据统计部分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个
相关推荐
Estar.Lee12 分钟前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
喜欢猪猪14 分钟前
Django:从入门到精通
后端·python·django
一个小坑货14 分钟前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet2718 分钟前
【Rust练习】22.HashMap
开发语言·后端·rust
uhakadotcom41 分钟前
如何实现一个基于CLI终端的AI 聊天机器人?
后端
Iced_Sheep1 小时前
干掉 if else 之策略模式
后端·设计模式
XINGTECODE2 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
程序猿进阶2 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺2 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
凡人的AI工具箱2 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang