zoukankan      html  css  js  c++  java
  • Oracle 列转行&行转列

    列转行
     
    方法一:
    create table tb_student(
           id number(4) ,
           name varchar2(20),
           course varchar2(20),
           score number(5,2)
    );
    insert into tb_student values(1,'张三','语文',81);
    insert into tb_student values(2,'张三','数学',75);
    insert into tb_student values(3,'李四','语文',86);
    insert into tb_student values(4,'李四','数学',90);
    insert into tb_student values(5,'王五','语文',81);
    insert into tb_student values(6,'王五','数学',100);
    insert into tb_student values(7,'王五','英语',90);
    commit;
    select * from tb_student;
    select
        name,
        sum(case course when '数学' then score else null end) 数学,
        sum(case course when '英语' then score else null end) 英语,
        sum(case course when '语文' then score else null end) 语文
    from
        tb_student
    group by name;
     
     
    create table zyy1(
    ID1 number,
    ID2 number,
    VALUE1 VARCHAR2(20),
    VALUE2 VARCHAR2(20)
    )
    INSERT INTO ZYY1 VALUES(1,2,'A','B');
    INSERT INTO ZYY1 VALUES(1,2,'C','D');
    INSERT INTO ZYY1 VALUES(1,2,'E','F');
    INSERT INTO ZYY1 VALUES(1,2,'G','H');
    INSERT INTO ZYY1 VALUES(3,8,'I','J');
    INSERT INTO ZYY1 VALUES(3,8,'K','L');
    INSERT INTO ZYY1 VALUES(3,8,'M','N');
    INSERT INTO ZYY1 VALUES(8,9,'O','P');
    INSERT INTO ZYY1 VALUES(8,9,'Q','R');
    INSERT INTO ZYY1 VALUES(11,12,'S','T');
    commit;
    select ID1,ID2,
    MAX(DECODE(RN,1,VALUE1)),
    MAX(DECODE(RN,1,VALUE2)),
    MAX(DECODE(RN,2,VALUE1)),
    MAX(DECODE(RN,2,VALUE2)),
    MAX(DECODE(RN,3,VALUE1)),
    MAX(DECODE(RN,3,VALUE2))
    FROM (SELECT ZYY1.*, ROW_NUMBER() OVER(partition by ID1,ID2  order by value1,value2) rn from zyy1) T
    where rn<=3
    group by ID1,ID2;
     
     
     
    --北京耗材中使用的例子
    select hosid,
           sum(case CATALOGNAME
                 when '国械注准20173461407' then
                  cnts
                 else
                  null
               end) 国械注准20173461407,
           sum(case CATALOGNAME
                 when '国械注进20173461507' then
                  cnts
                 else
                  null
               end) 国械注进20173461507,
           sum(case CATALOGNAME
                 when '国械注进20173466565' then
                  cnts
                 else
                  null
               end) 国械注进20173466565
      from (select hosid,
                   BASE_CATALOG.CATALOGNAME CATALOGNAME,
                   sum(BASE_DEMANDSCALE.Purcount) cnts
              from BASE_CATALOG
              left join BASE_DEMANDSCALE
                on BASE_DEMANDSCALE.CATALOGUEID =  BASE_CATALOG.catalogid
             where hosid = 'BJ_H0001'
             group by hosid, catalogid, CATALOGNAME)
    group by hosid;
     
    方法二 pivot:
     
    create table tb_student(
           id number(4) ,
           name varchar2(20),
           course varchar2(20),
           score number(5,2)
    );
    insert into tb_student values(1,'张三','语文',81);
    insert into tb_student values(2,'张三','数学',75);
    insert into tb_student values(3,'李四','语文',86);
    insert into tb_student values(4,'李四','数学',90);
    insert into tb_student values(5,'王五','语文',81);
    insert into tb_student values(6,'王五','数学',100);
    insert into tb_student values(7,'王五','英语',90);
    commit;
      select name, 语文, 数学, 英语
        from (select name, course, score from tb_student)
        pivot(max(score) for course in('语文' 语文,'数学' 数学,'英语'  英语))
       order by name
     
      select hosid,
             国械注准20173461407,
             国械注进20173461507,
             国械注进20173466565      
        from (select hosid, CATALOGNAME,  sum(BASE_DEMANDSCALE.Purcount) cnts
                from BASE_CATALOG
                left join BASE_DEMANDSCALE
                  on BASE_DEMANDSCALE.CATALOGUEID =  BASE_CATALOG.catalogid        
               group by hosid, catalogid, CATALOGNAME
               order by hosid, CATALOGNAME) pivot(max(cnts) for  CATALOGNAME in('国械注准20173461407'
                                                                                国械注准20173461407,
                                                                                '国械注进20173461507'
                                                                                国械注进20173461507,
                                                                                '国械注进20173466565'
                                                                                国械注进20173466565
                                                                              ))
       order by hosid;
     
    行转列:
     
    方法一  UNPIVOT:
    CREATE   TABLE  pvt (VendorID  int , Emp1  int , Emp2  int ,
          Emp3  int , Emp4  int , Emp5  int );
      INSERT   INTO  pvt  VALUES  ( 1 , 4 , 3 , 5 , 4 , 4 );
      INSERT   INTO  pvt  VALUES  ( 2 , 4 , 1 , 5 , 5 , 5 );
      INSERT   INTO  pvt  VALUES  ( 3 , 4 , 3 , 5 , 4 , 4 );
      INSERT   INTO  pvt  VALUES  ( 4 , 4 , 2 , 5 , 5 , 4 );
      INSERT   INTO  pvt  VALUES  ( 5 , 5 , 1 , 5 , 5 , 5 );
        
      SELECT  VendorID, Employee, Orders
      FROM  
         ( SELECT  VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
          FROM  pvt) p
      UNPIVOT
         (Orders  FOR  Employee  IN  
            (Emp1, Emp2, Emp3, Emp4, Emp5)
      ) ;
     
  • 相关阅读:
    使用jq.lazyload.js,解决设置loading图片的问题
    Write your first jQuery plugin
    如何在Less中使用使用calc
    web页面在ios下不支持fixed可用absolute替代的方案
    JavaScript内存优化
    js监听文本框内容变化
    动态绑定事件on
    CSS秘密花园:多边框
    2020—2021—1学期20202405《网络空间安全导论》第一周学习总结
    2020—2021—1学期20202405《网络空间安全导论》第五周学习总结
  • 原文地址:https://www.cnblogs.com/hcy-zyy/p/14782678.html
Copyright © 2011-2022 走看看