2015-10-26 6 views
0

У меня есть запрос на объединение с 2 частями. Часть 1 вычисляет сумму платежей за последний месяц, а часть 2 рассчитывает количество заявлений за последний месяц. Я использую следующий запросОбъединить результаты двух союзов

WITH DATA AS(
    (SELECT DA.ID, DDO.CODE, NULL AS PAYMENTS, ABS(SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY)) AS STATEMENTS --, FPP.AMOUNT_IN_DEFAULT_CURRENCY AS PAYMENTS 
    FROM DIM_ACCOUNT DA 
    JOIN DIM_DATA_OWNER DDO ON DA.DATA_OWNER_ID = DDO.ID 
    JOIN FACT_AS_TRANSACTION FAT ON FAT.ACCOUNT_ID = DA.ID 
    JOIN DIM_DATE DD ON FAT.VALUE_DATE_ID = DD.ID 
    WHERE DD.CAL_DATE >= TO_DATE('2015-09-20', 'YYYY-MM-DD') 
    AND FAT.DEBIT_CREDIT_MARK = 'Debit' 
    GROUP BY DA.ID, DDO.CODE 
    HAVING SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY) != 0) 
    UNION 
    (SELECT DA.ID, DDO.CODE, ABS(COALESCE(SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY),0)) AS PAYMENTS, NULL 
    FROM DIM_ACCOUNT DA 
    JOIN DIM_DATA_OWNER DDO ON DA.DATA_OWNER_ID = DDO.ID 
    JOIN FACT_PAY_PAYMENT FPP ON FPP.ORDERING_ACCOUNT_ID = DA.ID 
    JOIN DIM_PAY_PAYMENT_METHOD DPPM ON DPPM.ID = FPP.PAYMENT_METHOD_ID 
    JOIN DIM_DATE DD ON FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID 
    WHERE DD.CAL_DATE >= TO_DATE('2015-09-20', 'YYYY-MM-DD') 
    GROUP BY DA.ID, DDO.CODE) 
    ) 
    SELECT * FROM DATA 

Это дает следующий вывод received result То, что я хочу показать, заявление и выплаты по 1 линии. Поэтому этот результат должен быть объединен с 2 строками: expected result Как вы это понимаете?

+0

использование DISTINCT по ID каждой таблицы и попробовать. Пример: SELECT DISTINCT (id) FROM TABLE WHERE CONDITION. –

+0

Не следует ли лучше использовать агрегацию MAX для платежей и выписок? и группа по идентификатору и коду? – Jonas

+0

Попробуйте поставить 0 вместо NULL, затем сделайте все подзапрос, а во внешнем запросе выберите MAX of PAYMENTS и STATEMENTS. –

ответ

1

В случае, если вы действительно не можете присоединиться все вместе в одном операторе отбора, эта маленькая адаптация должна работать:

WITH DATA AS(
(SELECT DA.ID, DDO.CODE, 0 AS PAYMENTS, ABS(SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY)) AS STATEMENTS --, FPP.AMOUNT_IN_DEFAULT_CURRENCY AS PAYMENTS 
FROM DIM_ACCOUNT DA 
JOIN DIM_DATA_OWNER DDO ON DA.DATA_OWNER_ID = DDO.ID 
JOIN FACT_AS_TRANSACTION FAT ON FAT.ACCOUNT_ID = DA.ID 
JOIN DIM_DATE DD ON FAT.VALUE_DATE_ID = DD.ID 
WHERE DD.CAL_DATE >= TO_DATE('2015-09-20', 'YYYY-MM-DD') 
AND FAT.DEBIT_CREDIT_MARK = 'Debit' 
GROUP BY DA.ID, DDO.CODE 
HAVING SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY) != 0) 
UNION 
(SELECT DA.ID, DDO.CODE, ABS(COALESCE(SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY),0)) AS PAYMENTS, 0 AS STATEMENTS 
FROM DIM_ACCOUNT DA 
JOIN DIM_DATA_OWNER DDO ON DA.DATA_OWNER_ID = DDO.ID 
JOIN FACT_PAY_PAYMENT FPP ON FPP.ORDERING_ACCOUNT_ID = DA.ID 
JOIN DIM_PAY_PAYMENT_METHOD DPPM ON DPPM.ID = FPP.PAYMENT_METHOD_ID 
JOIN DIM_DATE DD ON FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID 
WHERE DD.CAL_DATE >= TO_DATE('2015-09-20', 'YYYY-MM-DD') 
GROUP BY DA.ID, DDO.CODE) 
) 
SELECT ID, CODE, SUM(PAYMENTS), SUM(STATEMENTS) FROM DATA 
GROUP BY ID, CODE 
0

Попробуйте что-то вроде этого, я присоединился ко всему этому в одном запросе. LEFT OUTER JOIN используется в том случае, если вы можете иметь данные только в одной таблице.

SELECT DA.ID, DDO.CODE, ABS(COALESCE(SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY),0)) AS PAYMENTS, ABS(SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY)) AS STATEMENTS 
    FROM DIM_ACCOUNT DA 
    JOIN DIM_DATA_OWNER DDO ON DA.DATA_OWNER_ID = DDO.ID 
    LEFT OUTER JOIN FACT_AS_TRANSACTION FAT ON FAT.ACCOUNT_ID = DA.ID 
    LEFT OUTER JOIN FACT_PAY_PAYMENT FPP ON FPP.ORDERING_ACCOUNT_ID = DA.ID 
    LEFT OUTER JOIN DIM_DATE DD1 ON FAT.VALUE_DATE_ID = DD1.ID 
    LEFT OUTER JOIN DIM_DATE DD2 ON FPP.REQUESTED_EXECUTION_DATE_ID = DD.DD2 
    LEFT OUTER JOIN DIM_PAY_PAYMENT_METHOD DPPM ON DPPM.ID = FPP.PAYMENT_METHOD_ID 
    WHERE DD1.CAL_DATE >= TO_DATE('2015-09-20', 'YYYY-MM-DD') 
    AND DD2.CAL_DATE >= TO_DATE('2015-09-20', 'YYYY-MM-DD') 
    AND FAT.DEBIT_CREDIT_MARK = 'Debit' 
    GROUP BY DA.ID, DDO.CODE 
    HAVING SUM(FAT.AMOUNT_IN_DEFAULT_CURRENCY) != 0 OR SUM(FPP.AMOUNT_IN_DEFAULT_CURRENCY) != 0; 
+0

Я могу сделать это только с помощью утверждения union. – Jonas

Смежные вопросы