如何用Hive查询实现学生成绩表的行转列转换
Hive实现行转列(Row to Column)解决方案
这是个很常见的行转列需求,在Hive里有两种实用的实现方式,根据你的Hive版本和个人习惯选就行:
方法一:使用CASE WHEN + 聚合函数(兼容所有Hive版本)
这种方法兼容性最好,不管你的Hive是哪个版本都能用。核心思路是通过CASE WHEN匹配每个科目,提取对应成绩,再用聚合函数(比如MAX)把同一学生的成绩聚合到一行:
SELECT std_id, std_name, -- 匹配英语科目,提取成绩,否则返回NULL MAX(CASE WHEN sub_name = 'Eng' THEN marks ELSE NULL END) AS Eng, -- 匹配科学科目 MAX(CASE WHEN sub_name = 'Science' THEN marks ELSE NULL END) AS Science, -- 匹配数学科目 MAX(CASE WHEN sub_name = 'Maths' THEN marks ELSE NULL END) AS Maths FROM -- 替换成你的实际表名 student_marks GROUP BY std_id, std_name;
为什么用MAX?
因为GROUP BY std_id, std_name之后,每个学生的每个科目只会有一条有效成绩(其他都是NULL),MAX会自动忽略NULL值,保留唯一的有效成绩。你也可以用SUM或者MIN,效果完全一样,只要每个学生每科只有一条记录。
方法二:使用PIVOT语法(Hive 2.3.0+ 支持)
如果你的Hive版本在2.3.0及以上,可以用更简洁的PIVOT语法,这是Hive专门为行转列场景提供的语法糖:
SELECT std_id, std_name, Eng, Science, Maths FROM student_marks PIVOT ( -- 指定聚合函数,这里用MAX处理成绩 MAX(marks) -- 指定要转成列的字段是sub_name FOR sub_name IN ('Eng' AS Eng, 'Science' AS Science, 'Maths' AS Maths) ) AS pivot_result;
注意事项
- 如果后续有新增科目,需要在对应的
CASE WHEN分支或者PIVOT的IN列表里添加对应的科目; - 如果同一个学生同一科目有多条记录,聚合函数会按逻辑处理(比如
SUM会把成绩相加,MAX会取最高分),根据你的业务需求选择合适的聚合函数; PIVOT语法需要Hive 2.3.0及以上版本,如果你用的是旧版本,还是用方法一更稳妥。
内容的提问来源于stack exchange,提问作者HEMANT PATEL
相关产品推荐
相关产品推荐

