【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

原文地址:https://www.cnblogs.com/heyang78/p/15426309.html