• oracle 列转行、行转列


    地址: https://blog.csdn.net/leq3915/article/details/80460316

    行转列:PIVOT

    列转行:UNPIVOT

    这两个是在oracle11g上面新增的函数。下面举例说明用法。

    PIVOT:

    学生成绩表,原数据:

    select class_name, student_name, course_type, result, created_date
    from class_tmp_2;


    每个同学的两门成绩,是两条数据,因为业务需要,展示给用户看的时候,用户想要每个同学只要一条数据,并且把所有成绩都展示出来,比如

    这个时候就需要用到行专列函数PIVOT.

    SELECT class_name, student_name, 语文, 数学, created_date
    FROM (SELECT CLASS_NAME, STUDENT_NAME, COURSE_TYPE, RESULT, CREATED_DATE
    FROM CLASS_TMP_2) T
    PIVOT(SUM(RESULT)
    FOR COURSE_TYPE IN('语文' AS 语文, '数学' AS 数学));
    浅灰色的sql和上面的原数据sql一样,主要看一下后面的PIVOT部分。

    sum(result):成绩之和(PIVOT内需有聚集函数)

    for course_type in ('语文' as语文, '数学' as数学):将course_type列的字段值转换成列名,其中,字段值是'语文',转换成语文列,字段值是'数学',转换成数学列,这两列的字段值,即前面的sum(result)。

    不用函数也可以得到,如下sql:

    select t1.class_name,
    t1.student_name,
    t1.result 语文,
    t2.result 数学,
    t1.created_date
    from (select a.class_name,
    a.student_name,
    a.course_type,
    a.result,
    a.created_date
    from class_tmp_2 a
    where a.course_type = '语文') t1,
    (select a.class_name,
    a.student_name,
    a.course_type,
    a.result,
    a.created_date
    from class_tmp_2 a
    where a.course_type = '数学') t2
    where t1.class_name = t2.class_name
    and t1.student_name = t2.student_name;


    UNPIVOT:列转行

    反过来,原数据如下:

    而我想要得到的结果如下:

    SQL:

    select class_name, student_name, course_type, result, created_date
    from class_tmp
    unpivot(result for course_type in(chinese_result,math_result));
    原数据的chinese_result列和math_result列的列名(浅灰色),将转换为新建列course_type的字段值,表示课种。

    原数据的chinese_result列和math_result列的字段值,将转换为新建列result的字段值,表示分数。

  • 相关阅读:
    [重写] 与 [重载]
    [抽象类] 与 [接口]
    (转载)虚函数表实现机制(即多态性实验机制)
    总结:细节问题(C++篇)
    串流类(istrstream)输入行为的探讨
    比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
    JS控制HTML元素的显示和隐藏
    cocos2dx ios iap接入
    关于cocos2dx 2.x lua 中cocos studio 界面,读入时,无法触摸的几点总结
    lua 元表,监控变量赋值及访问,并自动保存
  • 原文地址:https://www.cnblogs.com/mark5/p/12350497.html
Copyright © 2020-2023  润新知