Подскажите пожалуйста как добиться следующего о / п в оракуле? - PullRequest
0 голосов
/ 12 сентября 2018

output

ввод:

insert into example (fileno,type_cd,date_tm,be_nm) values('1','mismatch','match','mismatch');
insert into example (fileno,type_cd,date_tm,be_nm) values('2','match','mismatch','mismatch');
insert into example (fileno,type_cd,date_tm,be_nm) values('3','match','mismatch','match');
insert into example (fileno,type_cd,date_tm,be_nm) values('4','match','mismatch','mismatch');

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете отключить ваши начальные данные:

select *
from example
unpivot (match for column_name in
  (type_cd as 'type_cd', date_tm as 'date_tm', be_nm as 'be_nm'));

    FILENO COLUMN_ MATCH   
---------- ------- --------
         1 type_cd mismatch
         1 date_tm match   
         1 be_nm   mismatch
         2 type_cd match   
         2 date_tm mismatch
         2 be_nm   mismatch
...

и затем поверните это:

select *
from (
  select column_name, match
  from example
  unpivot (match for column_name in
    (type_cd as 'type_cd', date_tm as 'date_tm', be_nm as 'be_nm'))
)
pivot (count(*) for (match) in ('match' as match, 'mismatch' as mismatch));

COLUMN_NAME      MATCH   MISMATCH
----------- ---------- ----------
type_cd              3          2
date_tm              1          4
be_nm                2          3

Или немного меньше печатать, но, возможно, и менее ясно:

select *
from (select type_cd, date_tm, be_nm from example)
unpivot (match for column_name in
  (type_cd as 'type_cd', date_tm as 'date_tm', be_nm as 'be_nm'))
pivot (count(*) for (match) in ('match' as match, 'mismatch' as mismatch));

COLUMN_NAME      MATCH   MISMATCH
----------- ---------- ----------
type_cd              3          2
date_tm              1          4
be_nm                2          3

Я предположил, что вы пропустили строку во входных данных для 5 / mismatch / mismatch / match, поскольку без этого вы не получите эти итоги.


Или существует метод грубой силы, который включает условное агрегирование и объединение результатов нескольких запросов вместе, что требует многократного попадания в таблицу:

select 'type_cd' as column_name,
  count(case when type_cd = 'match' then 1 end) as match, 
  count(case when type_cd = 'mismatch' then 1 end) as mismatch
from example
union all
select 'date_tm' as column_name,
  count(case when date_tm = 'match' then 1 end) as match, 
  count(case when date_tm = 'mismatch' then 1 end) as mismatch
from example
union all
select 'be_nm' as column_name,
  count(case when be_nm = 'match' then 1 end) as match, 
  count(case when be_nm = 'mismatch' then 1 end) as mismatch
from example;

COLUMN_NAME      MATCH   MISMATCH
----------- ---------- ----------
type_cd              3          2
date_tm              1          4
be_nm                2          3

Подход «разворот / разворот», вероятно, лучше масштабируется как для производительности, так и для удобства обслуживания.

...