• 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

  • 相关阅读:
    复杂声明的正确解读(*、()、[])
    (多张图片打包为Zip返回前端下载) 记NetCore HttpClient.GetStreamAsync()返回只读流,Stream的Length属性不可用,报错的问题。
    ### Vue开发环境搭建
    计算机网络原理----CRC编码相关问题及解题思路
    CentOS7安装MongoDB4.4.4
    树莓派4B安装.NET Core 3.1 SDK
    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)
    解决Unity启动报错 Assertion failed on expression: 'SUCCEEDED(hr)'
    @RabbitListener注解导致spring bean注入属性为空 解决方案
    一文彻底讲透@Async注解的原理和使用方法
  • 原文地址:https://www.cnblogs.com/jinqi79731/p/2636585.html
Copyright © 2020-2023  润新知