@Amir1807

Как посчитать сумму по нескольким запросом?

Есть 2 селекта которые высчитывают сумму по определенным услвоиям.
Первый селект, высчитывает сумму если OP.M_OPERATION_TYPE_ID = 1 и если сумма ниже нуля HAVING SUM(OP.AMOUNT) < 0
Первый селект

SELECT OP.R_PERS_ACCOUNT_ID,
                               SUM(OP.AMOUNT),
                               trunc(OP.ACTUAL_DATE, 'month') - 1
                        FROM R_PERS_ACCOUNT PA
                                 JOIN NESTED_TABLE NT ON NT.R_PERS_ACCOUNT_ID = PA.R_PERS_ACCOUNT_ID
                                 join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
                        WHERE OP.R_PERS_ACCOUNT_ID IN NT.R_PERS_ACCOUNT_ID
                          AND IS_CHARGE_FINE = 0
                          AND OP.ACTUAL_DATE <= TO_DATE('31.12.2020', 'DD.MM.YYYY')
                          AND OP.M_OPERATION_TYPE_ID = 1
                        GROUP BY OP.R_PERS_ACCOUNT_ID, TRUNC(OP.ACTUAL_DATE, 'month') - 1
                        HAVING SUM(OP.AMOUNT) < 0


Второй селект должен высчитывать сумму после выполнения условии на первом селекте. Тут отличие от первого селекта в том что, OP.M_OPERATION_TYPE_ID = 2 и HAVING SUM(OP.AMOUNT) >= 0
Второй селект

SELECT OP.R_PERS_ACCOUNT_ID,
       OP.AMOUNT,
       trunc(OP.ACTUAL_DATE, 'month') - 1
FROM R_PERS_ACCOUNT PA
         JOIN NESTED_TABLE_2 NT_2 ON NT_2.R_PERS_ACCOUNT_ID = PA.R_PERS_ACCOUNT_ID
         join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
WHERE OP.R_PERS_ACCOUNT_ID IN NT_2.R_PERS_ACCOUNT_ID
  AND IS_CHARGE_FINE = 0
  AND OP.ACTUAL_DATE <= TO_DATE('31.12.2020', 'DD.MM.YYYY')
  AND OP.M_OPERATION_TYPE_ID = 2
GROUP BY OP.R_PERS_ACCOUNT_ID, TRUNC(OP.ACTUAL_DATE, 'month') - 1, OP.AMOUNT
HAVING SUM(OP.AMOUNT) >= 0;



У меня не получается сделать по вышеописанным условиям. Сделал что то подобное, но он не учитывает услвовия первого селекта.
Не рабочий селект

NESTED_TABLE_2 AS (SELECT OP.R_PERS_ACCOUNT_ID,
                               SUM(OP.AMOUNT),
                               trunc(OP.ACTUAL_DATE, 'month') - 1
                        FROM R_PERS_ACCOUNT PA
                                 JOIN NESTED_TABLE NT ON NT.R_PERS_ACCOUNT_ID = PA.R_PERS_ACCOUNT_ID
                                 join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
                        WHERE OP.R_PERS_ACCOUNT_ID IN NT.R_PERS_ACCOUNT_ID
                          AND IS_CHARGE_FINE = 0
                          AND OP.ACTUAL_DATE <= TO_DATE('31.12.2020', 'DD.MM.YYYY')
                          AND OP.M_OPERATION_TYPE_ID = 1
                        GROUP BY OP.R_PERS_ACCOUNT_ID, TRUNC(OP.ACTUAL_DATE, 'month') - 1
                        HAVING SUM(OP.AMOUNT) < 0)
SELECT OP.R_PERS_ACCOUNT_ID,
       OP.AMOUNT,
       trunc(OP.ACTUAL_DATE, 'month') - 1
FROM R_PERS_ACCOUNT PA
         JOIN NESTED_TABLE_2 NT_2 ON NT_2.R_PERS_ACCOUNT_ID = PA.R_PERS_ACCOUNT_ID
         join r_pers_acc_operation op on op.r_pers_account_id = pa.r_pers_account_id
WHERE OP.R_PERS_ACCOUNT_ID IN NT_2.R_PERS_ACCOUNT_ID
  AND IS_CHARGE_FINE = 0
  AND OP.ACTUAL_DATE <= TO_DATE('31.12.2020', 'DD.MM.YYYY')
  AND OP.M_OPERATION_TYPE_ID = 2
GROUP BY OP.R_PERS_ACCOUNT_ID, TRUNC(OP.ACTUAL_DATE, 'month') - 1, OP.AMOUNT
HAVING SUM(OP.AMOUNT) > 0;

  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab
Здесь отвечаю на вопросы.
Первый и второй запрос относятся к одной таблице, но имеют разные условия
Тогда нужно использовать конструкцию:
SELECT…
  FROM R_PERS_ACCOUNT PA1
   JOIN R_PERS_ACCOUNT PA2
    ON PA2.PA.R_PERS_ACCOUNT_ID = PA1.PA.R_PERS_ACCOUNT_ID
…
  WHERE OP1.M_OPERATION_TYPE_ID = 1 AND OP2.M_OPERATION_TYPE_ID = 2
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы