MySQL查询实现表结构转换:纵向表转横向表(含示例)
MySQL纵向表转横向结构实现方案
刚好处理过类似的需求!你要的是典型的行转列操作,下面给你两种适配不同MySQL版本的实现方式:
通用写法(兼容所有MySQL版本)
假设你的源表名为rainfall_data,可以用CASE WHEN配合聚合函数来实现:
SELECT Year, MAX(CASE WHEN MonthInterval = 'Jan-Feb' THEN RainfallIndex END) AS `Jan-Feb`, MAX(CASE WHEN MonthInterval = 'Feb-Mar' THEN RainfallIndex END) AS `Feb-Mar`, MAX(CASE WHEN MonthInterval = 'Mar-Apr' THEN RainfallIndex END) AS `Mar-Apr` FROM rainfall_data GROUP BY Year;
逻辑说明:
CASE WHEN会遍历每一行数据,匹配到对应月份区间时,取出对应的降雨量指数- 用
MAX()聚合函数(MIN()或SUM()也可以,因为每个年份+月份区间是唯一的,聚合后只会保留单个有效值)配合GROUP BY Year,把同一年的所有行数据合并成一行 - 注意带特殊字符的列名(比如
Jan-Feb)要用反引号`包裹,避免触发MySQL语法错误
简洁写法(仅MySQL 8.0+可用)
如果你的MySQL版本是8.0及以上,支持PIVOT语法,写法会更简洁:
SELECT * FROM rainfall_data PIVOT ( MAX(RainfallIndex) FOR MonthInterval IN ('Jan-Feb' AS `Jan-Feb`, 'Feb-Mar' AS `Feb-Mar`, 'Mar-Apr' AS `Mar-Apr`) ) AS pivoted_result;
补充说明:
如果你的月份区间是动态变化的(比如后续会新增更多区间),静态写法就不太方便了,这时候可以用动态SQL自动生成列名,不过从你的示例来看是固定的三个区间,上面的静态写法完全够用。
内容的提问来源于stack exchange,提问作者Sandy Pabilonia
相关产品推荐
相关产品推荐

