如何在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;
关键细节说明
- 日期参数化:子查询
date_params专门用来计算参考日期的年份和季度,如果你需要切换其他日期,只需要修改这里的'2018-04-14'即可;如果想用系统当前日期,直接换成CURDATE()。 - 跨年处理:每个季度的CASE判断都考虑了跨年情况(比如当前是Q1时,上一季度是去年的Q4),确保数据匹配准确。
- 聚合逻辑:用
SUM()配合CASE WHEN实现行转列,即使同一个person_id在同一个季度有多条数据,也会自动求和;如果没有数据,ELSE 0会填充默认值。
测试验证
用你提供的示例数据测试,查询这个视图会得到你想要的结果:
| person_id | num_quarter_1 | num_quarter_2 | num_quarter_3 | num_quarter_4 |
|---|---|---|---|---|
| 1 | 43 | 92 | 108 | 0 |
| 2 | 41 | 0 | 0 | 0 |
内容的提问来源于stack exchange,提问作者xunitc
相关产品推荐
相关产品推荐

