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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:58:49