循环 - 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');