当前位置: 首页 > article >正文

Mysql--报表业务处理

一. 背景

在日常工作中,我们可能会经常遇到一些业务报表数据的处理。比如,在电商业务里,我们可以通过报表清晰地了解每日销售总额,订单数量以及平均订单金额等关键指标。我们在报名参加训练营挑战时,也会有各种类型数据的统计。那我们该如何处理这种类型的业务呢?

在这里插入图片描述
在这里插入图片描述
这里我们以不同类型的训练营参加人数,训练营的挑战情况报表作为这次案例分析的主体。

二. 报表业务处理

2.1 业务说明

我们先来看一下目前训练营表,用户与训练营的关联表的基本表设计

训练营表

在这里插入图片描述

用户与训练营关联表

在这里插入图片描述
在这里插入图片描述

结合图表信息,我们不难看出第一个环形图是以训练营的业务类型进行分组归档。我们可以结合train_camp_type 进行分组即可得到对应的数据结果。
而第二个环形图中,有开启/未开启维度,也有挑战成功,失败,进行中维度。其中表设计上有一个很大的弊端,就是没有维护挑战失败的数据。我们只能通过sql 条件判断的维度进行查询。

2.2 sql 实现查询

训练营类型分组

SELECT
   tc.`train_camp_type` AS trainCampType,
   COUNT(1) AS trainCampCount
   FROM mkt.train_camp_user tcu
WHERE tcu.is_allow = 1
GROUP BY tc.`train_camp_type`

在表查出分组数据后,再通过代码对信息进行赋值
在这里插入图片描述

闯关情况类型分组

不同于第一个环形图,这里的闯关情况可以说是两个不同的维度。一个维度是未开启和已开启的分组,一个维度是挑战中,挑战成功,挑战失败的分组。对于第一个维度相对来说比较简单;而第二个维度中挑战失败的数据是只能通过 sql 条件进行拆解;

<!--挑战情况查询-->
<if test="query.isSuccess !=null and '' != query.isSuccess">
    <choose>
        <when test="query.isSuccess == 2">
            AND tcu.`is_open` =1 AND tcu.is_success = 0 AND NOW() >= tcu.train_camp_end_time
        </when>
        <when test="query.isSuccess == 0">
            AND tcu.`is_open` =1 AND tcu.is_success = 0 AND NOW()  <![CDATA[ < ]]>  tcu.train_camp_end_time
        </when>
        <otherwise>
             AND tcu.`is_open` =1 AND tcu.is_success = #{query.isSuccess}
        </otherwise>
    </choose>
</if>

对于上面的sql 也能很好的完成业务,不过需要每个挑战情况传入对应的值进行查询;相对来说加大了对数据库多次连接操作的压力。
而我们如果转换一种思路,把对应的条件写成对应的查询列中,不仅可以解决第二种维度的分组,甚至可以巧妙地把未开启的数据也进行归类,因为挑战中,挑战成功,挑战失败的训练营必须是已开启状态的。我们可以通过以下分段查询出对应挑战情况的数据。

SELECT
    challenge_status,
    COUNT(*) AS status_count
FROM (
    -- 子查询,用于根据条件生成不同挑战状态的新列
    SELECT tcu.id,
           CASE
               -- 挑战失败情况(对应query.isSuccess == 2的情况)
               WHEN tcu.`is_open` =1 AND  tcu.is_success = 0 AND NOW() > tcu.train_camp_end_time THEN '失败'
               -- 挑战进行中情况(对应query.isSuccess == 0的情况)
               WHEN tcu.`is_open` =1 AND tcu.is_success = 0 AND NOW() <= tcu.train_camp_end_time THEN '进行中'
               -- 挑战成功情况(其他情况,即query.isSuccess为1或者其他表示成功的值)
               WHEN tcu.`is_open` =1 AND tcu.is_success = 1 THEN '成功'
               ELSE '未开启'
               END AS challenge_status
    FROM train_camp_user tcu
    LEFT JOIN mkt.train_camp tc ON tc.id = tcu.train_camp_id
    WHERE tcu.`is_allow` = 1
) AS subquery
GROUP BY challenge_status;

http://www.kler.cn/a/415354.html

相关文章:

  • 【81-90期】Java核心面试问题深度解析:性能优化与高并发设计
  • C# 中的接口:定义行为契约与实现多态性
  • sqlmap使用过程中的每个步骤及其相关命令
  • Java 语言的起源发展与基本概念(JDK,JRE,JVM)
  • 【CSS】一篇掌握CSS
  • AI潮汐日报1128期:Sora泄露引发争议、百度早期研究对AI领域Scaling Law的贡献、Meta发布系列AI开源项目
  • uniapp连接mqtt频繁断开原因和解决方法
  • 滑动窗口讲解(c基础)
  • 《算法导论》英文版前言To the teacher第3段研习录:题海战术有没有?
  • 量化交易系统开发-实时行情自动化交易-4.4.1.做市策略实现
  • git merge :开发分支与主分支的交互
  • FTP介绍与配置
  • 【论文复现】上下位关系自动检测方法
  • 离线安装 Docker-IO:详细步骤指南
  • 非telnet方式测试端口状态
  • FuseGPT:生成式预训练变压器的可学习层融合
  • 嵌入式的应用领域有哪些
  • Admin.NET框架使用宝塔面板部署步骤
  • Spark基本命令详解
  • UI控件使用说明
  • 力扣 岛屿数量-200
  • Java—I/O流
  • react + vite 中的环境变量怎么获取
  • 网络安全中的数据科学如何重新定义安全实践?
  • 嵌入式开发之Bootloader移植(一)
  • 在更改文件名字关于PermissionError: [WinError 5] 拒绝访问。