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

MySQL存储过程SQL语法错误排查:透视表转置问题修复

MySQL透视表存储过程语法错误修复方案

错误排查

  • 表名拼写错误:原代码中多次写的tempShcedule是笔误,应为tempSchedule
  • 日期匹配逻辑错误:仅用day(dt)匹配天数,会导致跨月份的日期冲突,且无法生成完整日期列名
  • SQL拼接缺少逗号:SELECT concat(NIK,' - ',name)nm 和 @sql 之间没有逗号,导致语法断裂
  • 列名未转义:完整日期格式(如01/11/2022)作为列名时需要用反引号包裹,否则触发语法错误
  • 空值未处理:原逻辑中无记录的日期会显示NULL,不符合期望的OFF显示需求

修复后的存储过程代码

BEGIN
    SET @sql = NULL;

    -- 生成按完整日期作为列的CASE语句,处理空值为OFF,列名用反引号包裹
    SELECT GROUP_CONCAT(DISTINCT
        CONCAT(
            'MAX(CASE WHEN s.dt = ''',
            DATE_FORMAT(s.dt, '%d/%m/%Y'), -- 按原表日期格式转换
            ''' THEN s.tIn ELSE ''OFF'' END) AS `',
            DATE_FORMAT(s.dt, '%d/%m/%Y'),
            '`'
        )
    ) INTO @sql
    FROM tempSchedule s; -- 修正表名拼写

    -- 拼接完整SQL,添加必要逗号,GROUP BY NIK和name避免分组错误
    SET @sql = CONCAT(
        'SELECT NIK, name, ', -- 拆分显示NIK和name,符合期望结果结构
        @sql,
        ' FROM tempSchedule s GROUP BY NIK, name'
    );

    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

关键修复说明

  • 修正表名拼写,确保与实际表名一致
  • 使用DATE_FORMAT将日期转换为dd/mm/yyyy格式,作为列名和匹配条件,避免跨月日期冲突
  • 用反引号包裹日期列名,解决特殊格式列名的语法问题
  • 添加ELSE 'OFF',将无记录的日期值统一显示为OFF
  • 拆分NIK和name为单独列,匹配期望结果的结构;分组时按NIK+name组合,避免不同NIK同名时的分组错误
  • 拼接SQL时补充必要逗号,修复语法断裂问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:15:44