Используйте nvl2
, чтобы отметить строку как 1-строку типа 2-строки. Затем используйте unpivot
, который будет производить необходимые строки при удалении нулей. Последний шаг - назначить doc_type
в соответствии с бизнес-логикой:
Демоверсия dbfiddle
select attr, upper(org_name) org, country,
case when (rws = 1 and country = 'IN') or (rws = 2 and val = 'A1') then 'PAN'
when rws = 1 then 'COMPANY REGISTRATION DOCUMENT'
else 'PROPRIETORSHIP DOCUMENT'
end doc_type
from (
select *
from (select tbl_1.*, nvl2(attribute_2, 2, 1) rws from tbl_1) t
unpivot (attr for val in (attribute_1 as 'A1', attribute_2 as 'A2')))
Результат:
ATTR ORG COUNTRY DOC_TYPE
-------- ---- ------- -----------------------------
wcc_4599 ORG1 IN PAN
wcc_0123 ORG2 IN PAN
wcc_1983 ORG2 IN PROPRIETORSHIP DOCUMENT
wcc_2390 ORG3 US COMPANY REGISTRATION DOCUMENT
wcc_5647 ORG4 US PAN
wcc_8789 ORG4 US PROPRIETORSHIP DOCUMENT
6 rows selected
unpivot
доступен в Oracle 11g или более поздней версии. В старых версиях вы можете сделать это, используя union all
или присоединившись к таблице сопоставления.
Редактировать: union all
запрос, который может быть более читабельным:
select attribute_1 attr, upper(org_name) org, country,
case when country = 'IN' or attribute_2 is not null then 'PAN'
else 'COMPANY REGISTRATION DOCUMENT'
end doc_type
from tbl_1
union all
select attribute_2 attr, upper(org_name) org, country, 'PROPRIETORSHIP DOCUMENT'
from tbl_1
where attribute_2 is not null