SQL数据分组:如何将月份转为季度并计算季度平均值
月度数据转季度平均值的SQL实现
核心思路
通过将月份映射为季度标识,再按年份、季度、人员分类分组,计算对应季度的平均值。
通用SQL方案(兼容多数数据库)
方法1:用数学函数快速生成季度
SELECT year, CONCAT('Q', CEILING(month / 3)) AS quarter, no_of_people, ROUND(AVG(avg), 2) AS avg FROM your_table_name -- 替换为你的实际表名 GROUP BY year, CONCAT('Q', CEILING(month / 3)), no_of_people ORDER BY year, quarter;
方法2:用CASE WHEN直观映射季度(更易读)
SELECT year, CASE WHEN month BETWEEN 1 AND 3 THEN 'Q1' WHEN month BETWEEN 4 AND 6 THEN 'Q2' WHEN month BETWEEN 7 AND 9 THEN 'Q3' ELSE 'Q4' END AS quarter, no_of_people, ROUND(AVG(avg), 2) AS avg FROM your_table_name -- 替换为你的实际表名 GROUP BY year, CASE WHEN month BETWEEN 1 AND 3 THEN 'Q1' WHEN month BETWEEN 4 AND 6 THEN 'Q2' WHEN month BETWEEN 7 AND 9 THEN 'Q3' ELSE 'Q4' END, no_of_people ORDER BY year, quarter;
代码说明
- 季度转换:
- 方法1中
CEILING(month / 3)将1-3月转为1,4-6月转为2,以此类推,再通过CONCAT拼接成Q1格式的季度标识。 - 方法2用
CASE WHEN直接匹配月份区间,生成对应季度,逻辑更直观。
- 方法1中
- 平均值计算:
AVG(avg)计算分组内所有月度avg字段的平均值,ROUND(..., 2)用于保留2位小数(可根据需求调整)。 - 分组规则:按
year、quarter、no_of_people分组,确保每个季度的人员分类对应唯一的平均值。
示例结果(基于你的2005年数据)
| year | quarter | no_of_people | avg |
|---|---|---|---|
| 2005 | Q1 | Overall | 5.23 |
| 2005 | Q2 | Overall | 5.37 |
| 2005 | Q3 | Overall | 4.30 |
| 2005 | Q4 | Overall | 6.13 |
内容的提问来源于stack exchange,提问作者timothy
相关产品推荐
相关产品推荐

