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
相关产品推荐
相关产品推荐

