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

    defects表结构:

    create table defects(
        id number(4),
        code varchar2(6),
        type varchar2(10) check(type='oper' or type='sql' or type='api'),
        status number(1) check(status=0 or status=1),
        remark nvarchar2(100),
        primary key(id)
    )

    插值:

    declare 
       d integer;
       status integer;
    begin
    for i in 1..1000 loop
        d:=dbms_random.value(1,3);
        status:=dbms_random.value(0,1);
    
        insert into defects values(i,
                                   dbms_random.string('*',6),
                                   decode(d,1,'oper',2,'sql',3,'api'),
                                   status,
                       '');
    end loop;
    
    commit;
    
    end;
    /

    // 正常查询

    select 
        type,
        count(*) as total,
        sum(decode(status,1,1,0,0)) as completed,
        sum(decode(status,1,0,0,1)) as awiating
    from defects
    group by type

    效果:

    SQL> select
      2      type,
      3      count(*) as total,
      4      sum(decode(status,1,1,0,0)) as completed,
      5      sum(decode(status,1,0,0,1)) as awiating
      6  from defects
      7  group by type;
    
    TYPE                      TOTAL  COMPLETED   AWIATING
    -------------------- ---------- ---------- ----------
    api                         253        126        127
    sql                         511        248        263
    oper                        236        112        124

    行转列:

    语句:

    select
        'total' as class,
        sum(case type when 'oper' then 1 end) as oper,
        sum(case type when 'sql' then 1 end) as sql,
        sum(case type when 'api' then 1 end) as api
    from defects
    union all
    select
        'completed' as class,
        sum(case type when 'oper' then status end) as oper,
        sum(case type when 'sql' then status end) as sql,
        sum(case type when 'api' then status end) as api
    from defects
    union all
    select
        'awiating' as class,
        sum(case type when 'oper' then decode(status,1,0,0,1) end) as oper,
        sum(case type when 'sql' then decode(status,1,0,0,1) end) as sql,
        sum(case type when 'api' then decode(status,1,0,0,1) end) as api
    from defects

    效果:

    SQL> select
      2      'total' as class,
      3      sum(case type when 'oper' then 1 end) as oper,
      4      sum(case type when 'sql' then 1 end) as sql,
      5      sum(case type when 'api' then 1 end) as api
      6  from defects
      7  union all
      8  select
      9      'completed' as class,
     10      sum(case type when 'oper' then status end) as oper,
     11      sum(case type when 'sql' then status end) as sql,
     12      sum(case type when 'api' then status end) as api
     13  from defects
     14  union all
     15  select
     16      'awiating' as class,
     17      sum(case type when 'oper' then decode(status,1,0,0,1) end) as oper,
     18      sum(case type when 'sql' then decode(status,1,0,0,1) end) as sql,
     19      sum(case type when 'api' then decode(status,1,0,0,1) end) as api
     20  from defects;
    
    CLASS                    OPER        SQL        API
    ------------------ ---------- ---------- ----------
    total                     236        511        253
    completed                 112        248        126
    awiating                  124        263        127

    END

  • 相关阅读:
    数据结构_线性结构
    多线程01_基础
    操作系统05_文件管理
    解析静态内部类的使用目的与限制(转)
    mysql去除重复记录案例
    mysql 索引使用策略及优化
    mysql 索引数据结构及原理
    mysql 索引的简单使用
    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
    14 线程间协作的两种方式:wait、notify、notifyAll和Condition
  • 原文地址:https://www.cnblogs.com/heyang78/p/15426309.html
Copyright © 2011-2022 走看看