使用 Oracle 中增强的聚合报告功能解决问题
Solving problem using enhanced aggregate reporting functions in Oracle
我正在使用 sqlplus (oracle)。
我试图编写一个报表来显示基于
的所有交易价值的账户价值变化
- 每个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, ',999.99')
else TO_CHAR(transaction_amount, ',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
预期输出
使用联合
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, ',999.99')
else TO_CHAR(transaction_amount, ',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,',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
GROUP BY ROLLUP 是正确的选择。它允许您创建所有可能的小计和总计。汇总数据后,您只需加入客户 table 即可检索 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,',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,',999.99')
John Smith (null) 0.00
John Smith 2 0.00
John Smith 1 .00
James Anderson (null) 0.00
James Anderson 3 -0.00
James Anderson 1 0.00
(null) (null) (null) 0.00
我正在使用 sqlplus (oracle)。 我试图编写一个报表来显示基于
的所有交易价值的账户价值变化- 每个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, ',999.99')
else TO_CHAR(transaction_amount, ',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
预期输出
使用联合
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, ',999.99')
else TO_CHAR(transaction_amount, ',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,',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
GROUP BY ROLLUP 是正确的选择。它允许您创建所有可能的小计和总计。汇总数据后,您只需加入客户 table 即可检索 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,',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,',999.99')
John Smith (null) 0.00
John Smith 2 0.00
John Smith 1 .00
James Anderson (null) 0.00
James Anderson 3 -0.00
James Anderson 1 0.00
(null) (null) (null) 0.00