Dynamic Pivot CASE WHEN SQL报#1064错误,求修正并实现期望透视结果
修正Dynamic Pivot结合CASE WHEN的SQL语法错误并实现需求
原SQL的语法错误点
where子句中param_code = IN (20,43)语法错误,多余的=号,应改为param_code IN (20,43)- 动态SQL拼接时,直接使用
YEAR(res_date)会导致生成的SQL中保留字段名而非具体年份值,需先提取唯一年份再拼接 group by字段不完整,不符合SQL分组规则,需包含station_id, station_name, param_code三个字段res_value字段含逗号(字符串格式),需先转换为数值类型才能进行对数、指数运算- 未处理NULL值,无法实现期望输出中的
-占位
修正后的SQL代码
SET @sql = NULL; -- 提取所有唯一年份,拼接动态列语句 SELECT GROUP_CONCAT(DISTINCT CONCAT( "COALESCE(CASE WHEN param_code IN (20, 43) ", "THEN EXP(AVG(LOG(REPLACE(res_value, ',', '') * 1))) ", "ELSE AVG(REPLACE(res_value, ',', '') * 1) END, '-') AS `", YEAR(res_date), "`" ) ) INTO @sql FROM wq_results; -- 拼接完整查询语句 SET @sql = CONCAT( "SELECT tbl1.station_id AS `Station ID`, tbl2.station_name AS `Station Name`, tbl1.param_code AS `Parameter`, ", @sql, " FROM wq_results AS tbl1 LEFT JOIN mon_stations AS tbl2 ON tbl1.station_id = tbl2.id WHERE sc_id = '20' AND tbl1.param_code IN (20, 43) GROUP BY tbl1.station_id, tbl2.station_name, tbl1.param_code" ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
涉及表结构
wq_results表
| id | station_id | param_code | res_value | res_date |
|---|---|---|---|---|
| 1 | 1 | 20 | 1,452 | 2021-12-06 |
| 2 | 1 | 20 | 85 | 2022-12-06 |
| 3 | 1 | 20 | 1,854 | 2023-01-06 |
| 4 | 1 | 43 | 67 | 2023-01-06 |
| 5 | 2 | 43 | 1,285 | 2023-12-06 |
mon_stations表
| id | station_name |
|---|---|
| 1 | Station 1 |
| 2 | Station 2 |
期望输出
| Station ID | Station Name | Parameter | 2021 | 2022 | 2023 |
|---|---|---|---|---|---|
| 1 | Station 1 | 20 | 1,452 | 85 | 1,854 |
| 1 | Station 1 | 43 | - | - | 67 |
| 2 | Station 2 | 43 | - | - | 1,285 |
注:原期望输出中2023年param_code=20的值为8,254,推测为笔误,按实际数据计算应为1,854;若需特殊计算逻辑可调整AVG相关语句。
内容的提问来源于stack exchange,提问作者Ethan Marcus
相关产品推荐
相关产品推荐

