• oracle 函数中的行转列,列转行


    今天碰到一个行转列的问题,但是在网上看到很多的是列转行的,最后终于找到一个行转列的,在这里写一下,一来了方便自己看,二来了也方便有需要的朋友了参考下,我这里只是举个列子,具体还没深入研究。

    主要是两种方法:

    第一种:

    这是原数据,

    SQL> select * from s_student_result;

    NAME                        ENGLISH       MATH    PHYSISC    CHINESE TESTDATE
    ------------------------ ---------- ---------- ---------- ---------- -------------
    张三                             70         80         90         90 12-12月-11
    李四                             80         70         80         90 12-12月-11
    王五                             60         80         80         85 01-1月 -12

    需要转换为:


    NAME                     COURCE              SCORE TESTDATE
    ------------------------ -------------- ---------- --------------
    张三                     chinese                90 12-12月-11
    张三                     english                70 12-12月-11
    张三                     math                   80 12-12月-11
    张三                     pjysisc                90 12-12月-11
    李四                     chinese                90 12-12月-11
    李四                     english                80 12-12月-11
    李四                     math                   70 12-12月-11
    李四                     pjysisc                80 12-12月-11
    王五                     chinese                85 01-1月 -12
    王五                     english                60 01-1月 -12
    王五                     math                   80 01-1月 -12

    NAME                     COURCE              SCORE TESTDATE
    ------------------------ -------------- ---------- --------------
    王五                     pjysisc                80 01-1月 -12

    那么利用oracle中的union,sql语句如下:

    select  name,'english' cource,english as score ,testdate from s_student_result

    union  select  name,'math' cource,math as score, testdate from s_student_result t

    union  select  name,'pjysisc' cource,physisc as score ,testdate from s_student_result

    union  select  name,'chinese' cource,chinese as score, testdate from s_student_result

    第二种:

    创建一个中间表

    create table TEST_LH

    (

      NAME     VARCHAR2(20),

      COURCE   VARCHAR2(20),

      SCORE    NUMBER,

      TESTDATE DATE

    )

    然后插入语句

    insert all

     into test_lh values(name,'english',english,testdate)

     into test_lh values(name,'math',math,testdate)

     into test_lh values(name,'physisc',physisc,testdate)

     into test_lh values(name,'chinese',chinese,testdate)

    select name,t.english,t.math,t.physisc,t.chinese ,t.testdate from s_student_result t

    commit;

    然后查询结果如下:


    NAME                                     COURCE                                        SCORE TESTDATE
    ---------------------------------------- ---------------------------------------- ---------- -------
    张三                                     english                                          70 12-12月-11
    李四                                     english                                          80 12-12月-11
    王五                                     english                                          60 01-1月 -12
    张三                                     math                                             80 12-12月-11
    李四                                     math                                             70 12-12月-11
    王五                                     math                                             80 01-1月 -12
    张三                                     physisc                                          90 12-12月-11
    李四                                     physisc                                          80 12-12月-11
    王五                                     physisc                                          80 01-1月 -12
    张三                                     chinese                                          90 12-12月-11
    李四                                     chinese                                          90 12-12月-11

    NAME                                     COURCE                                        SCORE TESTDATE
    ---------------------------------------- ---------------------------------------- ---------- -------
    王五                                     chinese                                          85 01-1月 -12s

    列转行是相反的,这里就只写下sql语句(两种),

    select t.name,

    sum(decode(t.cource,'english',t.score)) as english,

    sum(decode(t.cource,'math',t.score)) as math,

    sum(decode(t.cource,'physisc',t.score)) as physisc,

    sum(decode(t.cource,'chinese',t.score))as chinese,

    t.testdate

    from test_lh t

    group by t.name,t.testdate

    select t.name,

     max(case cource when 'english' then score else 0 end) english,

     max(case cource when 'math' then score else 0 end) math,

     max(case cource when 'physisc' then score else 0 end) physisc,

     max(case cource when 'chinese' then score else 0 end) chinese,

     t.testdate

    from test_lh t

    group by t.name,t.testdate

  • 相关阅读:
    差分放大电路分析及运放单双电源供电对输出的影响
    反相加法器与同相加法器对比分析
    高频变压器绕组绕制方式与漏感大小分析与计算
    高频变压器绕组绕制方式与分布电容大小分析与计算
    反激电路开关管电流尖峰分析
    涡流效应产生原因及分析
    磁路-电路通用变换方法及电路对偶变换
    反激电路RCD缓冲电路参数设计分析
    STM32 CUBE
    TEB 系统综合误差
  • 原文地址:https://www.cnblogs.com/wujin/p/2325796.html
Copyright © 2020-2023  润新知