Oracle SQL Заголовок и детализация - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь создать вывод стиля заголовка и детализации, который может выводить строку заголовка, затем строки детализации, затем строку заголовка, затем строки детализации и т. Д.

Будет использоваться две таблицы:

HeaderTable:

MAIN_NO MAIN_DESCRIPTION MAIN_CUST MAIN_NAME
1       Apple            Student   John
2       Pear             Child     Peter
3       Orange           Alien     Matt

DetailTable:

MAIN_NO PERF EVENT INFO   PREV_VALUE NEW_VALUE REV STATE MODIFIED   NOTE
1       ABC  YES   RED    12         30        0   Con   01/02/2018 FALSE
1       DEF  YES   BLUE   18         34        0   Con   01/04/2018 FALSE
2       GHI  NO    BLUE   14         38        0   UUU   01/07/2018 TRUE
2       JKL  NO    RED    11         39        0   Con   01/03/2018 FALSE
3       MNO  NO    GREEN  19         32        0   UUU   01/01/2018 TRUE
3       PQR  YES   WHITE  10         33        0   UUU   01/08/2018 TRUE

Желаемый вывод:

MAIN_NO MAIN_DESCRIPTION MAIN_CUST MAIN_NAME
1       Apple            Student   John
1       ABC  YES   RED    12         30        0   Con   01/02/2018 FALSE
1       DEF  YES   BLUE   18         34        0   Con   01/04/2018 FALSE
2       Pear             Child     Peter
2       GHI  NO    BLUE   14         38        0   UUU   01/07/2018 TRUE
2       JKL  NO    RED    11         39        0   Con   01/03/2018 FALSE
3       Orange           Alien     Matt
3       MNO  NO    GREEN  19         32        0   UUU   01/01/2018 TRUE
3       PQR  YES   WHITE  10         33        0   UUU   01/08/2018 TRUE

SQL Fiddle: http://sqlfiddle.com/#!4/bacd0c

Текущий код:

SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME
FROM 
(
    SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME, null, null, null, null, null, MAIN_NO rnk 
    FROM HeaderTable

    UNION ALL

    SELECT MAIN_NO, PERF, EVENT, INFO, PREV_VALUE, NEW_VALUE, REV, STATE, MODIFIED,   NOTE, rnk 
    FROM 
    (
        SELECT hd.*, hd.MAIN_NO || '.' || ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO) rnk
        FROM IFSAPP.HeaderTable h 
        INNER JOIN DetailTable hd on h.MAIN_NO= hd.MAIN_NO
    ) K     
)p 
ORDER BY rnk

Однако я получаю сообщение об ошибке:

ORA-00909: неверное количество аргументов

Хотя я даже не уверен, что это даст мне желаемый результат.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Исходная ошибка ORA-00909 исходит от concat(), которая принимает только два аргумента; у вас есть три:

concat(hd.MAIN_NO, '.', ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO))

Вам нужны вложенные вызовы:

concat(concat(hd.MAIN_NO, '.'), ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO)))

или используйте оператор ||:

hd.MAIN_NO || '.' || ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO)

Как отмечено в комментариях, у вас есть другие проблемы; Исправление проблемы concat позволяет вместо этого появиться сообщение об ошибке «ORA-01789: блок запросов содержит неверное количество столбцов результатов». (Как и в вашем измененном вопросе.) Вы можете исправить это с помощью нулей, также предложенных в комментариях; но ваши rnk столбцы также различаются по типу - первая ветвь использует число из таблицы, вторая - строку - что получит «ORA-01790: выражение должно иметь тот же тип данных, что и соответствующее выражение».

Я думаю, вы хотите просто рассматривать заголовок как ранг 0 в main_no, что полностью исключает объединение:

SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME,
  PREV_VALUE, NEW_VALUE, REV, STATE, MODIFIED, NOTE
FROM (
    SELECT MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME,
        null as prev_value, null as new_value, null as rev, null as state,
        null as modified, null as note, 0 rnk
    FROM HeaderTable
    UNION ALL
    SELECT hd.MAIN_NO, hd.PERF, hd.EVENT, hd.INFO,
        hd.PREV_VALUE, hd.NEW_VALUE, hd.REV, hd.STATE, hd.MODIFIED, hd.NOTE,
        ROW_NUMBER() over (PARTITION BY hd.MAIN_NO ORDER BY hd.MAIN_NO) as rnk
    FROM HeaderTable h 
    INNER JOIN DetailTable hd on h.MAIN_NO= hd.MAIN_NO
)
ORDER BY main_no, rnk
/

   MAIN_NO MAIN_D MAIN_CU MAIN_ PREV_VALUE  NEW_VALUE        REV STA MODIFIED   NOTE
---------- ------ ------- ----- ---------- ---------- ---------- --- ---------- -----
         1 Apple  Student John
         1 ABC    YES     RED           12         30          0 Con 01/02/2018 FALSE
         1 DEF    YES     BLUE          18         34          0 Con 01/04/2018 FALSE
         2 Pear   Child   Peter
         2 GHI    NO      BLUE          14         38          0 UUU 01/07/2018 TRUE
         2 JKL    NO      RED           11         39          0 Con 01/03/2018 FALSE
         3 Orange Alien   Matt
         3 MNO    NO      GREEN         19         32          0 UUU 01/01/2018 TRUE
         3 PQR    YES     WHITE         10         33          0 UUU 01/08/2018 TRUE

Я также удалил некоторые ненужные подзапросы; вам нужно, чтобы rnk был включен в окончательный набор результатов.

С опозданием заметили, что вы добавите SQL-скрипку для данных; вот результат для этого .

Вы можете явным образом привести нули к ожидаемому типу данных, но в этом нет необходимости; просто для забавы я сделал это в этой демонстрации db <> fiddle , с вашими примерами данных в CTE.

0 голосов
/ 27 июня 2018

Почему у вас есть два раза MAIN_NO в секунду выбора?

Похоже на опечатку.

MAIN_NO, MAIN_DESCRIPTION, MAIN_CUST, MAIN_NAME, MAIN_NO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...