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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:29:21