Oracle中用Join、Case When、To_char实现行转列结果异常求助
问题分析与解决思路
你的问题核心是日期格式提取逻辑错误,导致CASE WHEN的条件始终不成立,最终SUM结果全为0。
错误原因:
- 第一个查询直接将日期类型的
b.日期与字符串'Nov'比较,类型不匹配,条件永远不满足。 - 第二个查询使用
To_char(b.日期, 'dd-mon-yyyy')生成的是完整日期字符串(如'12-nov-2022'),和'Nov'完全不相等,条件同样不成立。
正确解决方法:
使用TO_CHAR函数时,指定仅提取月份缩写的格式参数:
- 若数据库返回的月份缩写为混合大小写(如
Nov/Dec),用'Mon'参数; - 若为全大写(如
NOV/DEC),用'MON'参数。
修正后的SQL语句:
select a.姓名 as 姓名, sum(case when TO_CHAR(b.日期, 'Mon') = 'Nov' then b.分数 else 0 end) as "11月分数", sum(case when TO_CHAR(b.日期, 'Mon') = 'Dec' then b.分数 else 0 end) as "12月分数" from 表A a join 表B b on a.编号 = b.编号 group by a.姓名;
特殊情况处理:
如果日期字段是字符串类型而非日期类型,需要先转换为日期格式再提取月份:
select a.姓名 as 姓名, sum(case when TO_CHAR(TO_DATE(b.日期, 'dd-mon-yyyy'), 'Mon') = 'Nov' then b.分数 else 0 end) as "11月分数", sum(case when TO_CHAR(TO_DATE(b.日期, 'dd-mon-yyyy'), 'Mon') = 'Dec' then b.分数 else 0 end) as "12月分数" from 表A a join 表B b on a.编号 = b.编号 group by a.姓名;
内容的提问来源于stack exchange,提问作者Christian Nathanael
相关产品推荐
相关产品推荐

