循环 - SQL 开发人员
Loop - SQL Developer
我在 SQL 数据库中有以下 table,
Acct_Num Date Amount Debit_Credit
001234 10/Jan/2014 56879 Credit
001234 15/Jan/2014 56879 Debit
001234 10/Feb/2014 10000 Credit
001234 09/Feb/2014 9000 Credit
001234 25/Mar/2014 19000 Credit
预期输出
Acct_no Month Consolidate Credit Consolidate Debit Balance
001234 JAN 56879 56879 0
001234 FEB 19000 0 19000
问题:
系统应该为一个完整的月份分别选择按月合并借方/贷方。用户将输入日期(例如 15.01.2014 ),系统应从开始月份开始收集借方和贷方的总和,即从 2014 年 1 月开始,循环应以当前系统月份结束,即 9 月 - 15
您应该尽量避免在 SQL 中循环。 SQL 基于离散数学,因此您应该始终尝试集合运算。
要解决您的问题,您应该按帐号、日期然后是借记或贷记类型列进行分组。在您的主要 select 中,您应该对您的金额列求和并将您的日期仅转换为月份值。重叠超过一年时要小心,您可能需要在输出中添加年份列。
这是一个纯粹的 SQL 解决方案,包括一个基于您的数据的创建 table 语句。
设置如下:
CREATE TABLE Trans
(Acct_Num varchar2(6), Tran_date date, Amount number, Debit_Credit varchar2(6))
;
INSERT ALL
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('10-Jan-2014','dd-mon-yyyy'), 56879, 'Credit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('15-Jan-2014','dd-mon-yyyy'), 56879, 'Debit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('10-Feb-2014','dd-mon-yyyy'), 10000, 'Credit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('09-Feb-2014','dd-mon-yyyy'), 9000, 'Credit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('25-Mar-2014','dd-mon-yyyy'), 19000, 'Credit')
SELECT * FROM dual;
和解决方案的三个变体。
选项 1 枢轴然后聚合:
with pvt as (
select *
from trans
pivot (sum(amount)
FOR Debit_Credit IN ( 'Credit' AS Credit
, 'Debit' AS Debit))
)
select acct_num
, trunc(tran_date, 'month') period_Start
, sum(credit) consolidate_credit
, sum(debit) consolidate_debit
, nvl(sum(credit),0)
- nvl(sum(debit),0) total
from pvt
group by acct_num
, trunc(tran_date, 'month');
选项 2 预处理日期,然后让数据透视表进行聚合:
with dta as (
select acct_num, trunc(tran_date, 'month') tran_date
, amount, Debit_Credit
from trans
)
select acct_num
, tran_date
, credit consolidate_credit
, debit consolidate_debit
, nvl(credit,0)
- nvl(debit,0) total
from dta
pivot (sum(amount)
FOR Debit_Credit IN ( 'Credit' AS Credit
, 'Debit' AS Debit));
选项 3 枢轴和聚合合而为一:
select acct_num
, trunc(tran_date, 'month')
, sum(credit) consolidate_credit
, sum(debit) consolidate_debit
, nvl(sum(credit),0)
- nvl(sum(debit),0) total
from trans
pivot (sum(amount)
FOR Debit_Credit IN ( 'Credit' AS Credit
, 'Debit' AS Debit))
group by acct_num
, trunc(tran_date, 'month');
我在 SQL 数据库中有以下 table,
Acct_Num Date Amount Debit_Credit
001234 10/Jan/2014 56879 Credit
001234 15/Jan/2014 56879 Debit
001234 10/Feb/2014 10000 Credit
001234 09/Feb/2014 9000 Credit
001234 25/Mar/2014 19000 Credit
预期输出
Acct_no Month Consolidate Credit Consolidate Debit Balance
001234 JAN 56879 56879 0
001234 FEB 19000 0 19000
问题:
系统应该为一个完整的月份分别选择按月合并借方/贷方。用户将输入日期(例如 15.01.2014 ),系统应从开始月份开始收集借方和贷方的总和,即从 2014 年 1 月开始,循环应以当前系统月份结束,即 9 月 - 15
您应该尽量避免在 SQL 中循环。 SQL 基于离散数学,因此您应该始终尝试集合运算。
要解决您的问题,您应该按帐号、日期然后是借记或贷记类型列进行分组。在您的主要 select 中,您应该对您的金额列求和并将您的日期仅转换为月份值。重叠超过一年时要小心,您可能需要在输出中添加年份列。
这是一个纯粹的 SQL 解决方案,包括一个基于您的数据的创建 table 语句。
设置如下:
CREATE TABLE Trans
(Acct_Num varchar2(6), Tran_date date, Amount number, Debit_Credit varchar2(6))
;
INSERT ALL
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('10-Jan-2014','dd-mon-yyyy'), 56879, 'Credit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('15-Jan-2014','dd-mon-yyyy'), 56879, 'Debit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('10-Feb-2014','dd-mon-yyyy'), 10000, 'Credit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('09-Feb-2014','dd-mon-yyyy'), 9000, 'Credit')
INTO Trans (Acct_Num, Tran_date, Amount, Debit_Credit)
VALUES ('001234', to_Date('25-Mar-2014','dd-mon-yyyy'), 19000, 'Credit')
SELECT * FROM dual;
和解决方案的三个变体。
选项 1 枢轴然后聚合:
with pvt as (
select *
from trans
pivot (sum(amount)
FOR Debit_Credit IN ( 'Credit' AS Credit
, 'Debit' AS Debit))
)
select acct_num
, trunc(tran_date, 'month') period_Start
, sum(credit) consolidate_credit
, sum(debit) consolidate_debit
, nvl(sum(credit),0)
- nvl(sum(debit),0) total
from pvt
group by acct_num
, trunc(tran_date, 'month');
选项 2 预处理日期,然后让数据透视表进行聚合:
with dta as (
select acct_num, trunc(tran_date, 'month') tran_date
, amount, Debit_Credit
from trans
)
select acct_num
, tran_date
, credit consolidate_credit
, debit consolidate_debit
, nvl(credit,0)
- nvl(debit,0) total
from dta
pivot (sum(amount)
FOR Debit_Credit IN ( 'Credit' AS Credit
, 'Debit' AS Debit));
选项 3 枢轴和聚合合而为一:
select acct_num
, trunc(tran_date, 'month')
, sum(credit) consolidate_credit
, sum(debit) consolidate_debit
, nvl(sum(credit),0)
- nvl(sum(debit),0) total
from trans
pivot (sum(amount)
FOR Debit_Credit IN ( 'Credit' AS Credit
, 'Debit' AS Debit))
group by acct_num
, trunc(tran_date, 'month');