Решение проблемы с использованием расширенных функций составления отчетов в Oracle - PullRequest
0 голосов
/ 22 февраля 2019

Я использую sqlplus (оракул).Я пытаюсь написать заявление, чтобы показать изменение стоимости счета на основе стоимости всех транзакций для

  • каждого customer_account_combination
  • каждого клиента
  • всего банка

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

Вот что я получил до сих пор.

select wc.first_name "First", wc.surname "Last", wt.account_type "Act Type" 
case when wt.transaction_type is NULL then NULL 
    when wt.transaction_type = 'D'then TO_CHAR(transaction_amount*-1, '$9,999.99') 
    else TO_CHAR(transaction_amount, '$9,999.99') 
    end "Total" 
from wgb_customer wc join wgb_account wa on wa.customer_number = wc.customer_number join wgb_account_type wt on wa.account_type = wt.account_type
left outer join wgb_transaction wt on wt.customer_number = wa.customer_number 
and wt.account_type = wa.account_type
order by 2,3,6;

Однако он не работает и не отображает итоги клиентов или итоги.Пожалуйста, помогите!

ERD ERD

Ожидаемый результат Expected output

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

GROUP BY ROLLUP - это путь.Это позволяет создавать все возможные промежуточные итоги и общий итог.После объединения данных вы просто оставили соединение с таблицей клиентов, чтобы получить имена first_name и last_name.Обязательно выполните левое объединение, чтобы не потерять общий итог

--SAMPLE TABLES AND TEST DATA 

  CREATE TABLE WGB_TRANSACTION (
    CUSTOMER_NUMBER VARCHAR2(7),
    ACCOUNT_TYPE NUMBER(1),
    TRANSACTION_AMOUNT NUMBER,
    TRANSACTION_TYPE VARCHAR2(1)
  );

  CREATE TABLE WGB_CUSTOMER (
    CUSTOMER_NUMBER VARCHAR2(7),
    FIRST_NAME VARCHAR2(30),
    SURNAME VARCHAR2(30)
   );

INSERT INTO WGB_CUSTOMER VALUES ( '123', 'John','Smith');
INSERT INTO WGB_CUSTOMER VALUES ( '456', 'James','Anderson');
INSERT INTO WGB_TRANSACTION VALUES (123,1,100,'C');
INSERT INTO WGB_TRANSACTION VALUES (123,1,50,'D');
INSERT INTO WGB_TRANSACTION VALUES (123,2,100,'C');
INSERT INTO WGB_TRANSACTION VALUES (456,1,50,'C');
INSERT INTO WGB_TRANSACTION VALUES (456,1,100,'C');
INSERT INTO WGB_TRANSACTION VALUES (456,3,100,'D');
INSERT INTO WGB_TRANSACTION VALUES (456,1,50,'C');

--The Query 
WITH BALANCES AS (
    SELECT CUSTOMER_NUMBER, ACCOUNT_TYPE, 
    SUM(DECODE(TRANSACTION_TYPE,'D',-1,'C',1,0)*TRANSACTION_AMOUNT) BALANCE
    FROM WGB_TRANSACTION WHERE TRANSACTION_TYPE IN ('C','D') 
    GROUP BY ROLLUP ( CUSTOMER_NUMBER, ACCOUNT_TYPE )
)
SELECT C.FIRST_NAME, C.SURNAME, B.ACCOUNT_TYPE, TO_CHAR(B.BALANCE,'$9,999.99')
FROM BALANCES B LEFT JOIN WGB_CUSTOMER C ON C.CUSTOMER_NUMBER=B.CUSTOMER_NUMBER;

--RESULT 
FIRST_NAME  SURNAME ACCOUNT_TYPE    TO_CHAR(B.BALANCE,'$9,999.99')
John    Smith   (null)  $150.00
John    Smith   2   $100.00
John    Smith   1   $50.00
James   Anderson    (null)  $100.00
James   Anderson    3   -$100.00
James   Anderson    1   $200.00
(null)  (null)  (null)  $250.00
0 голосов
/ 22 февраля 2019

использовать союз

    select wc.first_name "First", wc.surname "Last", wt.account_type "Act Type" 
    case when wt.transaction_type is NULL then NULL 
        when wt.transaction_type = 'D'then TO_CHAR(transaction_amount*-1, '$9,999.99') 
        else TO_CHAR(transaction_amount, '$9,999.99') 
        end "Total" 
    from wgb_customer wc join wgb_account wa on wa.customer_number = wc.customer_number join wgb_account_type wt on wa.account_type = wt.account_type
    left outer join wgb_transaction wt on wt.customer_number = wa.customer_number 
    and wt.account_type = wa.account_type
union 
 select '','',TO_CHAR(total,'$9,999.99') from 
(
select  
       sum ( case when wt.transaction_type is NULL then 0
        when wt.transaction_type = 'D' then transaction_amount*-1 
        else transaction_amount
        end ) as total
    from wgb_customer wc join wgb_account wa on wa.customer_number = wc.customer_number join wgb_account_type wt on wa.account_type = wt.account_type
    left outer join wgb_transaction wt on wt.customer_number = wa.customer_number 
    and wt.account_type = wa.account_type
) t
...