@Amir1807

Как объединить несколько сложных запросов?

Есть такой запрос который выводит данные по id (R_PERS_ACCOUNT_ID) и дате (MAX(RBS.CREATE_DATE))
Первый запрос
Select rpao.r_pers_account_id, max(rbs.create_date)
from r_base_trans rbs
         join r_pers_acc_operation rpao on rbs.r_base_trans_id = rpao.r_base_trans_id
where rbs.create_date between to_date('01.12.2017', 'dd.mm.yyyy') and to_date('31.12.2020', 'dd.mm.yyyy')
  and rbs.M_BASE_TRANS_TYPE_ID NOT IN 26
  and ROWNUM < 100
group by rpao.r_pers_account_id;

62e8f759bbbe8375478707.jpeg
Есть еще один запрос в который нужно вставлять данные с предыдущего селекта. В условии where где pa.r_pers_account_id нужно вставлять id с предыдущей таблицы. И в to_date('31-01-2018', 'dd-mm-yyyy') только дата должна быть как конец месяца. (Получается если дата из предыдущей таблицы 12.01.2018 то должно вставляться 31.01.2018) так же данные по дате с предыдущей таблицы. (В моем случае вставил вручную только одни данные)
Второй запрос
select TP.IIN_BIN,
       pa.r_pers_account_id,
       pa.close_date,
       kbk.kbk_code,
       org.code_nk,
       org.CODE_TPK,
       op.m_operation_type_id,
       pa.open_date,
       sum(op.amount)
from r_pers_account pa
         join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id
         join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
         join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id
         join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id
where pa.r_pers_account_id in (16616864)
  and is_charge_fine = 0
  and trunc(op.actual_date, 'fmdd') <= to_date('31-01-2018', 'dd-mm-yyyy')
  and op.m_operation_type_id = 1
group by tp.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, op.m_operation_type_id, org.code_nk,
         org.code_tpk, pa.open_date;

62e8f9f1aec16162111910.jpeg


В этом селекте тоже самое нужно вставлять данные по id и дате.
Третий запрос
select TP.IIN_BIN,
       pa.r_pers_account_id,
       pa.close_date,
       kbk.kbk_code,
       org.code_nk,
       org.CODE_TPK,
       op.m_operation_type_id,
       pa.open_date,
       sum(op.amount)
from r_pers_account pa
         join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id
         join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
         join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id
         join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id
where pa.r_pers_account_id in (16616864)
  and is_charge_fine = 0
  and trunc(op.actual_date, 'fmdd') <= to_date('31-01-2018', 'dd-mm-yyyy')
  and op.m_operation_type_id = 2
group by tp.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, op.m_operation_type_id, org.code_nk,
         org.code_tpk, pa.open_date;

62e8fb79b595e177892025.jpeg

Нужно сделать так чтобы эти 3 запроса были одним select-ом.

К дополнению, после объединении этих запросов, нужно выводить данные по условию если у второго селекта столбец sum(op.amount) имеет отрицательное число, а у третьего селекта столбец sum(op.amount) имеет 0 или положительное число.
  • Вопрос задан
  • 292 просмотра
Пригласить эксперта
Ответы на вопрос 2
iMedved2009
@iMedved2009
Не люблю людей
Для PostgresSQL
То ли я чего то не понимаю в задаче, то ли как то так
select TP.IIN_BIN,
       pa.r_pers_account_id,
       pa.close_date,
       kbk.kbk_code,
       org.code_nk,
       org.CODE_TPK,
       op.m_operation_type_id,
       pa.open_date,
       sum(op.amount)
from r_pers_account pa
         join (Select rpao.r_pers_account_id, max(rbs.create_date) as date
               from r_base_trans rbs
                        join r_pers_acc_operation rpao on rbs.r_base_trans_id = rpao.r_base_trans_id
               where rbs.create_date between to_date('01.12.2017', 'dd.mm.yyyy') and to_date('31.12.2020', 'dd.mm.yyyy')
                 and rbs.M_BASE_TRANS_TYPE_ID NOT IN 26
  and ROWNUM < 100
               group by rpao.r_pers_account_id) as nested_table
              on nested_table.r_pers_account_id = pa.r_pers_account_id and nested_table.date >= trunc(op.actual_date, 'fmdd')
         join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id
         join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
         join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id
         join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id
where is_charge_fine = 0
  and op.m_operation_type_id in (1, 2)
group by tp.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, op.m_operation_type_id, org.code_nk,
         org.code_tpk, pa.open_date;


можно конечно через cte
with nested_table as (
Select rpao.r_pers_account_id, max(rbs.create_date) as date
               from r_base_trans rbs
                        join r_pers_acc_operation rpao on rbs.r_base_trans_id = rpao.r_base_trans_id
               where rbs.create_date between to_date('01.12.2017', 'dd.mm.yyyy') and to_date('31.12.2020', 'dd.mm.yyyy')
                 and rbs.M_BASE_TRANS_TYPE_ID NOT IN 26
  and ROWNUM < 100
               group by rpao.r_pers_account_id
)
select TP.IIN_BIN,
       pa.r_pers_account_id,
       pa.close_date,
       kbk.kbk_code,
       org.code_nk,
       org.CODE_TPK,
       op.m_operation_type_id,
       pa.open_date,
       sum(op.amount)
from r_pers_account pa
         join nested_table on nested_table.r_pers_account_id = pa.r_pers_account_id and nested_table.date >= trunc(op.actual_date, 'fmdd')
         join r_tax_payer tp on pa.r_tax_payer_id = tp.r_tax_payer_id
         join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
         join m_kbk kbk on kbk.m_kbk_id = pa.m_kbk_id
         join m_tax_org org on org.m_tax_org_id = pa.m_tax_org_id
where is_charge_fine = 0
  and op.m_operation_type_id in (1, 2)
group by tp.IIN_BIN, pa.r_pers_account_id, pa.close_date, kbk.kbk_code, op.m_operation_type_id, org.code_nk,
         org.code_tpk, pa.open_date;
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Нужно сделать так чтобы эти 3 запроса были одним select-ом.
Выполнение хранимой процедуры — это один запрос содержащий множество запросов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы