Требуется дополнительная строка в select на основании некоторого условия - PullRequest
0 голосов
/ 07 января 2019

У меня есть таблица со столбцами: attribute_1, attribute_2, org_name, страна

attribute_1  attribute_2  org_name  country
wcc_4599        null        org1     IN
wcc_0123        wcc_1983    org2     IN
wcc_2390        null        org3     US
wcc_5647        wcc_8789    org4     IN

Мои требования:

  1. Исходя из следующих условий, я должен определить тип документа

         (i) if country  = India , attribute_1 != null, attribute_2  = null THEN Document Type ==> PAN
        (ii) if country  = India , attribute_1 != null, attribute_2 != null THEN Document Type ==> PAN , PROPRIETORSHIP DOCUMNENT
       (iii) if country != India , attribute_1 != null, attribute_2  = null THEN Document Type ==> COMPANY REGISTRAION DOCUMENT
    
  2. для случая (ii) мне нужно показать две строки для каждой записи, сначала для attribute_1, а затем для attribute_2

У меня следующий запрос

SELECT   
     attribute_1,
     attribute_2,
     upper(org_name) org_name,                      
     country,
CASE
    WHEN country = 'IN'
         AND attribute_1 IS NOT NULL
         AND attribute_2 IS NULL THEN 'PAN'
    WHEN country = 'IN'
         AND attribute_1 IS NOT NULL
         AND attribute_2 IS NOT NULL THEN 'PAN , PROPRIETORSHIP DOCUMNENT'
    WHEN country != 'IN'
         AND attribute_1 IS NOT NULL
         AND attribute_2 IS NULL THEN 'COMPANY REGISTRAION DOCUMENT'     
END
doc_name
            FROM
                tbl_1
            ORDER BY
                created_date_time;

ВЫХОД:

attribute_1  attribute_2  org_name  country doc_type
wcc_4599        null        org1     IN      PAN
wcc_0123        wcc_1983    org2     IN      PAN, PROPRIETORSHIP DOCUMENT
wcc_2390        null        org3     US      COMPANY REGISTRAION DOCUMENT
wcc_5647        wcc_8789    org4     IN      PAN, PROPRIETORSHIP DOCUMENT

Но мне нужен вывод, как:

attribute_1_2  org_name country doc_type
wcc_4599        org1     IN      PAN
wcc_0123        org2     IN      PAN
wcc_1983        org2     IN      PROPRIETORSHIP DOCUMENT
wcc_2390        org3     US      COMPANY REGISTRAION DOCUMENT
wcc_5647        org4     IN      PAN
wcc_8789        org4     IN      PROPRIETORSHIP DOCUMENT

В настоящее время я создал процедуру для получения необходимого результата. Но я хочу сделать это по запросу. Возможно ли это?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Используйте 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
0 голосов
/ 07 января 2019

Я думаю, что здесь отсутствует таблица, которая могла бы отобразить скалярный вывод выражения CASE в одну или несколько строк. Рассмотрите возможность использования следующего CTE, а также поместите текущий запрос в CTE:

WITH doc_type AS (
    SELECT 1 AS id, 'PAN' AS type FROM dual UNION ALL
    SELECT 2, 'PAN' FROM dual UNION ALL
    SELECT 2, 'PROPRIETORSHIP DOCUMNENT' FROM dual UNION ALL
    SELECT 3, 'COMPANY REGISTRAION DOCUMENT' FROM dual
),
cte AS (
    SELECT
        attribute_1,
        attribute_2,
        UPPER(org_name) org_name,
        country,
        created_date_time
    CASE WHEN country = 'IN' AND
              attribute_1 IS NOT NULL AND
              attribute_2 IS NULL THEN 1
         WHEN country = 'IN' AND
              attribute_1 IS NOT NULL AND
              attribute_2 IS NOT NULL THEN 2
         WHEN country != 'IN' AND
              attribute_1 IS NOT NULL AND
              attribute_2 IS NULL THEN 3 END AS doc_id
    FROM tbl_1
)

Теперь мы можем присоединить ваш текущий вычисляемый столбец из выражения CASE для генерации ожидаемых записей:

SELECT
    t1.attribute_1,
    t1.attribute_2,
    t1.org_name,
    t1.country,
    t2.type
FROM cte t1
INNER JOIN doc_type t2
    ON t1.doc_id = t2.id
ORDER BY
    t1.created_date_time;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...