如何对GROUP BY分组后不同行执行不同聚合函数并格式化输出?
解决温度记录月度聚合与格式转换问题
假设你的Temperature_records表结构如下(包含日期和每日的最低、最高、平均温度字段):
CREATE TABLE Temperature_records ( record_date DATE, min_temp INT, max_temp INT, avg_temp DECIMAL(5,2) );
方案1:生成(month, data_type)分组的长表格式输出
如果需要按(月份, 数据类型)的分组形式输出(每行对应一个月份的一个温度类型),可以通过UNION ALL分别计算每个类型的月度聚合值,再合并结果:
-- 月度最低温度 SELECT MONTH(record_date) AS month, 'min' AS data_type, ROUND(MIN(min_temp)) AS value FROM Temperature_records WHERE YEAR(record_date) = 2020 GROUP BY MONTH(record_date) UNION ALL -- 月度最高温度 SELECT MONTH(record_date) AS month, 'max' AS data_type, ROUND(MAX(max_temp)) AS value FROM Temperature_records WHERE YEAR(record_date) = 2020 GROUP BY MONTH(record_date) UNION ALL -- 月度平均温度 SELECT MONTH(record_date) AS month, 'avg' AS data_type, ROUND(AVG(avg_temp)) AS value FROM Temperature_records WHERE YEAR(record_date) = 2020 GROUP BY MONTH(record_date) ORDER BY month, data_type;
逻辑说明:
- 每个
SELECT块单独处理一种温度类型的聚合:用MIN(min_temp)计算月度最低,MAX(max_temp)计算月度最高,AVG(avg_temp)计算月度平均 - 用
ROUND()函数对聚合结果四舍五入取整 - 通过
UNION ALL合并三个结果集,确保所有(month, data_type)组合都被覆盖 - 最后按
month和data_type排序,让结果更规整
方案2:生成宽表格式输出(每月一行,含三个温度指标)
如果需要将月度的三个指标放在同一行展示,可以直接按月份分组,同时计算三个聚合值:
SELECT MONTH(record_date) AS month, ROUND(MIN(min_temp)) AS monthly_min, ROUND(MAX(max_temp)) AS monthly_max, ROUND(AVG(avg_temp)) AS monthly_avg FROM Temperature_records WHERE YEAR(record_date) = 2020 GROUP BY MONTH(record_date) ORDER BY month;
逻辑说明:
- 直接按月份分组,在同一个
SELECT中同时计算三种温度类型的月度值 - 每个聚合函数对应正确的每日温度字段,并用
ROUND()取整 - 结果每行对应一个月份,包含三个温度指标列,适合需要横向查看月度数据的场景
内容的提问来源于stack exchange,提问作者gollapudi sravani
相关产品推荐
相关产品推荐

