You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL 5.1.72-community中创建视图展示最近4个季度数据

解决MySQL季度数据透视视图的问题

嗨,我来帮你搞定这个视图创建的需求!针对你的MySQL 5.1.72环境和production表结构,我们可以通过条件聚合的方式来实现你要的季度数据透视效果,具体步骤如下:

核心逻辑梳理

首先明确参考日期2018-04-14对应的是2018年第2季度,然后推导四个目标季度的范围:

  • quarter_1:当前季度(2018Q2)
  • quarter_2:上一季度(2018Q1)
  • quarter_3:上上季度(2017Q4)
  • quarter_4:上上上季度(2017Q3)

我们需要把每个person_id在这四个季度的num值分别映射到对应的列,没有数据的季度填充0。

视图创建SQL

直接用下面的SQL语句创建视图即可,里面已经包含了日期参数的计算和条件聚合逻辑:

CREATE VIEW person_quarterly_num AS
SELECT
    person_id,
    -- 第1季度:当前日期对应的季度
    SUM(CASE WHEN p_year = curr_year AND p_quarter = curr_quarter THEN num ELSE 0 END) AS num_quarter_1,
    -- 第2季度:上一季度(处理跨年情况,比如当前是Q1时,上一季度是去年Q4)
    SUM(CASE 
        WHEN curr_quarter = 1 THEN (CASE WHEN p_year = curr_year - 1 AND p_quarter = 4 THEN num ELSE 0 END)
        ELSE (CASE WHEN p_year = curr_year AND p_quarter = curr_quarter - 1 THEN num ELSE 0 END)
    END) AS num_quarter_2,
    -- 第3季度:上上一季度(处理多种跨年场景)
    SUM(CASE 
        WHEN curr_quarter = 1 THEN (CASE WHEN p_year = curr_year - 1 AND p_quarter = 3 THEN num ELSE 0 END)
        WHEN curr_quarter = 2 THEN (CASE WHEN p_year = curr_year - 1 AND p_quarter = 4 THEN num ELSE 0 END)
        ELSE (CASE WHEN p_year = curr_year AND p_quarter = curr_quarter - 2 THEN num ELSE 0 END)
    END) AS num_quarter_3,
    -- 第4季度:上上上一季度(处理所有跨年场景)
    SUM(CASE 
        WHEN curr_quarter = 1 THEN (CASE WHEN p_year = curr_year - 1 AND p_quarter = 2 THEN num ELSE 0 END)
        WHEN curr_quarter = 2 THEN (CASE WHEN p_year = curr_year - 1 AND p_quarter = 3 THEN num ELSE 0 END)
        WHEN curr_quarter = 3 THEN (CASE WHEN p_year = curr_year - 1 AND p_quarter = 4 THEN num ELSE 0 END)
        ELSE (CASE WHEN p_year = curr_year AND p_quarter = curr_quarter - 3 THEN num ELSE 0 END)
    END) AS num_quarter_4
FROM
    production,
    -- 子查询获取参考日期的年份和季度,方便后续修改日期
    (SELECT 
        YEAR('2018-04-14') AS curr_year,
        QUARTER('2018-04-14') AS curr_quarter
    ) AS date_params
GROUP BY
    person_id;

关键细节说明

  1. 日期参数化:子查询date_params专门用来计算参考日期的年份和季度,如果你需要切换其他日期,只需要修改这里的'2018-04-14'即可;如果想用系统当前日期,直接换成CURDATE()。
  2. 跨年处理:每个季度的CASE判断都考虑了跨年情况(比如当前是Q1时,上一季度是去年的Q4),确保数据匹配准确。
  3. 聚合逻辑:用SUM()配合CASE WHEN实现行转列,即使同一个person_id在同一个季度有多条数据,也会自动求和;如果没有数据,ELSE 0会填充默认值。

测试验证

用你提供的示例数据测试,查询这个视图会得到你想要的结果:

person_idnum_quarter_1num_quarter_2num_quarter_3num_quarter_4
143921080
241000

内容的提问来源于stack exchange,提问作者xunitc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:49:30