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

如何在MySQL中将指定列转换为行(列转行操作)

MySQL列转行实现方案

原表结构与数据

prod_datemodelassemblyAM_OutputPM_OutputAM WHrsPM WHrs
2023-08-01AFAN2112010.750
2023-08-02AFAN144097810.7510.75
2023-08-03AFAN1134010.750

目标表结构与数据

prod_datemodelassemblyShift_OutOutputWHrs
2023-08-01AFANAM211210.75
2023-08-02AFANAM144010.75
2023-08-03AFANAM113410.75
2023-08-01AFANPM00
2023-08-02AFANPM97810.75
2023-08-03AFANPM00

实现方法

方法1:UNION ALL(兼容所有MySQL版本)

这是最通用的方案,分别提取AM、PM班次的数据后合并结果:

-- 提取AM班次数据
SELECT 
    prod_date,
    model,
    assembly,
    'AM' AS Shift_Out,
    AM_Output AS Output,
    `AM WHrs` AS WHrs
FROM your_table_name

UNION ALL

-- 提取PM班次数据
SELECT 
    prod_date,
    model,
    assembly,
    'PM' AS Shift_Out,
    PM_Output AS Output,
    `PM WHrs` AS WHrs
FROM your_table_name

-- 可选:按日期和班次排序
ORDER BY prod_date, Shift_Out;

注意:

  • 替换your_table_name为实际表名;如果是多表左连接的结果,直接把整个左连接语句用括号包裹替换掉your_table_name
  • 因列名包含空格,AM WHrs和PM WHrs需要用反引号`包裹

方法2:CROSS JOIN + CASE(MySQL 5.7+,灵活扩展)

通过生成班次列表,用CASE语句匹配对应列的值:

SELECT 
    t.prod_date,
    t.model,
    t.assembly,
    s.shift AS Shift_Out,
    CASE s.shift
        WHEN 'AM' THEN t.AM_Output
        WHEN 'PM' THEN t.PM_Output
    END AS Output,
    CASE s.shift
        WHEN 'AM' THEN t.`AM WHrs`
        WHEN 'PM' THEN t.`PM WHrs`
    END AS WHrs
FROM your_table_name t
CROSS JOIN (
    SELECT 'AM' AS shift UNION ALL SELECT 'PM' AS shift
) s
ORDER BY t.prod_date, s.shift;

方法3:LATERAL JOIN(MySQL 8.0.14+,简洁高效)

利用LATERAL JOIN直接为每行生成两条班次记录:

SELECT 
    t.prod_date,
    t.model,
    t.assembly,
    s.*
FROM your_table_name t
JOIN LATERAL (
    SELECT 'AM' AS Shift_Out, t.AM_Output AS Output, t.`AM WHrs` AS WHrs
    UNION ALL
    SELECT 'PM' AS Shift_Out, t.PM_Output AS Output, t.`PM WHrs` AS WHrs
) s
ORDER BY t.prod_date, s.Shift_Out;

内容的提问来源于stack exchange,提问作者silver

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:34:53