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

如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍

如何在 MySQL 5.6 中实现按季度分组并找到销量最高的书籍

    • 引言
    • 问题描述
    • 实现步骤
      • 1. 计算每本书在每个季度的累计销量
      • 2. 找到每个季度的最高累计销量
      • 3. 匹配最高销量的书籍
    • 总结
    • 扩展练习


引言

在数据分析和业务报表中,经常需要对数据进行分组统计,并找到每个分组中的最大值或最小值。例如,在图书销售系统中,我们可能需要按季度统计每本书的销量,并找到每个季度销量最高的书籍。然而,在 MySQL 5.6 中,由于不支持窗口函数(如 RANK()ROW_NUMBER())和 WITH 语句(CTE),实现这一功能需要一些技巧。本文将详细介绍如何在 MySQL 5.6 中实现这一需求。


问题描述

假设我们有两个表:

  • books 表:存储书籍信息,包括 bookidtitle
  • sales 表:存储销售记录,包括 saleidbookidsaledatequantity

我们的目标是:

  1. 按季度统计每本书的累计销量。
  2. 找到每个季度销量最高的书籍。
  3. 如果某个季度有多本书的销量相同且都是最高销量,则一起展示。

实现步骤

1. 计算每本书在每个季度的累计销量

首先,我们需要计算每本书在每个季度的累计销量。可以通过 GROUP BYSUM() 函数来实现。

SELECT
    t2.title,
    t1.bookid,
    QUARTER(t1.saledate) AS sale_QUARTER,
    SUM(t1.quantity) AS total_quantity
FROM
    sales t1
JOIN
    books t2 ON t1.bookid = t2.bookid
WHERE
    YEAR(t1.saledate) = 2023  -- 假设查询 2023 年的数据
GROUP BY
    t1.bookid, t2.title, QUARTER(t1.saledate);

解释

  • 使用 QUARTER(t1.saledate) 提取季度信息。
  • 使用 SUM(t1.quantity) 计算每本书在每个季度的累计销量。
  • bookidtitlequarter 分组。

结果示例

titlebookidsale_QUARTERtotal_quantity
Book A1125
Book B2130
Book C3130

2. 找到每个季度的最高累计销量

接下来,我们需要找到每个季度的最高累计销量。可以通过子查询和 MAX() 函数来实现。

SELECT
    sale_QUARTER,
    MAX(total_quantity) AS max_quantity
FROM (
    SELECT
        QUARTER(t1.saledate) AS sale_QUARTER,
        SUM(t1.quantity) AS total_quantity
    FROM
        sales t1
    WHERE
        YEAR(t1.saledate) = 2023
    GROUP BY
        t1.bookid, QUARTER(t1.saledate)
) AS quarterly_sales
GROUP BY
    sale_QUARTER;

解释

  • 子查询计算每本书在每个季度的累计销量。
  • 外层查询按季度分组,并使用 MAX(total_quantity) 找到每个季度的最高销量。

结果示例

sale_QUARTERmax_quantity
130
240

3. 匹配最高销量的书籍

最后,我们将第一步的结果与第二步的结果连接,找到每个季度累计销量等于最高销量的书籍。

SELECT
    table1.sale_QUARTER,
    table1.title,
    table1.bookid,
    table1.total_quantity
FROM (
    -- 第一步的结果
    SELECT
        t2.title,
        t1.bookid,
        QUARTER(t1.saledate) AS sale_QUARTER,
        SUM(t1.quantity) AS total_quantity
    FROM
        sales t1
    JOIN
        books t2 ON t1.bookid = t2.bookid
    WHERE
        YEAR(t1.saledate) = 2023
    GROUP BY
        t1.bookid, t2.title, QUARTER(t1.saledate)
) AS table1
JOIN (
    -- 第二步的结果
    SELECT
        sale_QUARTER,
        MAX(total_quantity) AS max_quantity
    FROM (
        SELECT
            QUARTER(t1.saledate) AS sale_QUARTER,
            SUM(t1.quantity) AS total_quantity
        FROM
            sales t1
        WHERE
            YEAR(t1.saledate) = 2023
        GROUP BY
            t1.bookid, QUARTER(t1.saledate)
    ) AS quarterly_sales
    GROUP BY
        sale_QUARTER
) AS max_sales
ON table1.sale_QUARTER = max_sales.sale_QUARTER
   AND table1.total_quantity = max_sales.max_quantity
ORDER BY
    table1.sale_QUARTER;

解释

  • 将第一步的结果与第二步的结果连接,条件是季度相同且累计销量等于最高销量。
  • 如果某个季度有多本书的销量相同且都是最高销量,则一起展示。

结果示例

sale_QUARTERtitlebookidtotal_quantity
1Book B230
1Book C330
2Book A140

总结

在 MySQL 5.6 中,由于不支持窗口函数和 WITH 语句,我们可以通过子查询和连接操作来实现复杂的分组统计需求。本文通过一个具体的例子,详细介绍了如何按季度分组并找到销量最高的书籍。关键点包括:

  1. 使用 GROUP BYSUM() 计算每本书在每个季度的累计销量。
  2. 使用子查询和 MAX() 找到每个季度的最高销量。
  3. 通过连接操作匹配最高销量的书籍。

这种方法虽然稍显复杂,但在 MySQL 5.6 中是一种有效的解决方案。希望本文对你理解和掌握 MySQL 的分组统计技巧有所帮助!


扩展练习

  1. 修改查询,统计每年的销量最高的书籍。
  2. 尝试在 MySQL 8.0 中使用窗口函数(如 RANK())实现相同的功能,并比较两种方法的性能。
  3. sales 表上创建索引,优化查询性能。

如果你有任何问题或需要进一步的帮助,欢迎留言讨论!

相关文章:

  • QT c++ QMetaObject::invokeMethod函数 线程给界面发送数据
  • UE5中的快捷键汇总
  • 电源测试和测量系统的创新遥感方法可以消除哪些潜在问题
  • 土建施工员考试题库及答案
  • 在 CentOS 上更改 SSH 默认端口以提升服务器安全性
  • Django 初学小案例:用户登录
  • Windows搭建SVN本地服务器 + TortoiseSVN客户端
  • SQL Query美化
  • 单细胞学习(13)—— Seurat → Scanpy 分析流程
  • UnrealEngine开发无人机飞行模拟软件的手柄如何选择
  • JAVA生产环境(IDEA)排查死锁
  • Grafana Windows在 Windows 上轻松实现数据监控与可视化
  • VSCODE - 连接远程linux服务器,报错XHR failed 解决方法
  • C语言-------结构体(1)
  • 华宇TAS应用中间件与因朵科技多款产品完成兼容互认证
  • 内容中台驱动企业数字化内容管理高效协同架构
  • Spring框架中都用到了哪些设计模式?
  • 电商小程序(源码+文档+部署+讲解)
  • 【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析
  • MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
  • “80后”北大硕士罗婕履新甘肃宁县县委常委、组织部部长
  • 人民日报和音:相信中国就是相信明天
  • 蔡建忠已任昆山市副市长、市公安局局长
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途
  • 赡养纠纷个案推动类案监督,检察机关保障特殊群体胜诉权
  • 商务部:长和集团出售港口交易各方不得规避审查