Oracle SQL порядок извлечения данных - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь достичь этого макета. Я не делюсь запросом, потому что он работает, мне просто интересно, какие функции использовать для достижения формата '2'. В начале я делал UNION ALL, вот так я получил формат '1'. Данные извлекаются из нескольких таблиц. Я пытаюсь добиться этого без PL SQL. Спасибо!

Как я понял '1'

    +-----+----+---+-----+
    |col_1|col2|...|col_n|
    +-----+----+---+-----+
    |  A  |bla |...+  3  |
    +-----+----+---+-----+
    |  A  |bla1|...|  1  |
    +-----+----+---+-----+
    |  B  |asd |...+  2  |
    +-----+----+---+-----+
    |  B  |qwe1|...|  6  |
    +-----+----+---+-----+
    |  B  |zxc1|...|  1  |
    +-----+----+---+-----+
    |Sum:A|    |...|  4  |
    +-----+----+---+-----+
    |Sum:B|    |...|  9  |
    +-----+----+---+-----+

Как я хочу его преобразовать '2'

    +-----+----+---+-----+
    |col_1|col2|...|col_n|
    +-----+----+---+-----+
    |  A  |bla |...+  3  |
    +-----+----+---+-----+
    |     |bla1|...|  1  |
    +-----+----+---+-----+
    |Sum:A|    |...|  4  |
    +-----+----+---+-----+
    |  B  |asd |...+  2  |
    +-----+----+---+-----+
    |     |qwe1|...|  6  |
    +-----+----+---+-----+
    |     |zxc1|...|  1  |
    +-----+----+---+-----+
    |Sum:B|    |...|  9  |
    +-----+----+---+-----+

select 
        col_1
       ,col_2
       ...
       col_n
from(
    select 
        kce.name as col_1
       ,kcp.other_name as col_2
       ...
       ,irm.col_n
    from tab_1 irm
    left join tab_2 kce
    on irm.irm_s_id = kce.id
    left join tab_3 kcp
    on irm.irm_p_id = kcp.id
    where irm.customer = :P1_GROUP
    order by irm.irm_s_id,irm.irm_p_id
)
union all
select 'Sum '||col_1
       ,null
       ...
       ,sum(col_n)
from(
    select 
        kce.name as col_1
       ,kcp.other_name as col_2
       ...
       ,irm.col_n
    from tab_1 irm
    left join tab_2 kce
    on irm.irm_s_id = kce.id
    left join tab_3 kcp
    on irm.irm_p_id = kcp.id
    where irm.customer = :P1_GROUP
    order by irm.irm_s_id,irm.irm_p_id
) group by 'Sum '||col_1

Ответы [ 2 ]

3 голосов
/ 21 января 2020

APEX имеет встроенную поддержку для этого типа форматирования в Classi c Reports - это называется Break Formatting. Чтобы получить представление о том, как это работает, выполните следующие действия:

Создайте отчет Classi c со следующим запросом:

select job,
  ename,
  sal
from emp
order by job, sal

Go в параметрах отчета и установите Разбить столбцы (при форматировании разрыва) на первый столбец. Затем просверлите столбец SAL и включите параметр Sum .

Это должно дать вам что-то вроде этого: enter image description here

См. Это сообщение в блоге Джеффа Эберхарда для получения дополнительной информации: https://blog.eberapp.com/ords/f?p=BLOG: ЧИТАТЬ ::::: АРТИКУЛ: 6555300346233507 & cs = 17CDD85DFBD5E33D7BD8F7945B94027CE

1 голос
/ 21 января 2020

Я думаю, что вам может пригодиться создание еще одного столбца в вашем запросе, то есть col_1 || сумма (всего при этом значении col_1).

Таким образом, во всех строках с col_1 = A этот столбец будет иметь значение «A 4» или что-то вроде «Sum of all A is 4», что вы хотите.

Затем отобразите это в интерактивном отчете и установите разрыв в этом новом столбце.

Затем запрос будет аккуратно отсортирован по блокам с различными значениями col_1, а сумма блоков ниже этого значения будет следующей. к нему.

Это потребует переписывания запроса, фактически небольшого дополнения к нему. Но мы не можем помочь с этим, так как вы не опубликовали запрос.

РЕДАКТИРОВАТЬ:

Теперь, когда вы добавили запрос, я заметил еще одну вещь, которую вы могли бы сделать

SELECT * FROM(
    select  col_1 as col_0
           ,col_1
           ,col_2
           ...
           col_n
    from(
        select 
            kce.name as col_1
           ,kcp.other_name as col_2
           ...
           ,irm.col_n
        from tab_1 irm
        left join tab_2 kce
        on irm.irm_s_id = kce.id
        left join tab_3 kcp
        on irm.irm_p_id = kcp.id
        where irm.customer = :P1_GROUP
        order by irm.irm_s_id,irm.irm_p_id
    )
    union all
    select  col_1 as col_0
           ,'Sum '||col_1 as col_1
           ,null
           ...
           ,sum(col_n)
    from(
        select 
            kce.name as col_1
           ,kcp.other_name as col_2
           ...
           ,irm.col_n
        from tab_1 irm
        left join tab_2 kce
        on irm.irm_s_id = kce.id
        left join tab_3 kcp
        on irm.irm_p_id = kcp.id
        where irm.customer = :P1_GROUP
        order by irm.irm_s_id,irm.irm_p_id
    ) group by 'Sum '||col_1)
  ORDER BY col_0, col_1 desc

Это в основном просто добавление еще одного столбца, который является значением col_1, затем вы упорядочиваете по нему так, чтобы у вас были все As и сумма A вместе, все Bs ... Тогда порядок по col_1 так, что вы гарантируете Сумма A идет до или после A, в зависимости от того, выбираете ли вы возрастание или убывание.

Если затем спрятать этот первый столбец в вершине, получится то, что вы ищете.

...