小飞外卖,数据统计部分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 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien1 小时前
Spring Boot常用注解
java·spring boot·后端
盛派网络小助手3 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
∝请叫*我简单先生3 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
zquwei4 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
dessler4 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
Q_19284999065 小时前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
ZSYP-S5 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
Yuan_o_6 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端