【问题标题】:Loop - SQL Developer循环 - SQL 开发人员
【发布时间】:2015-09-15 23:42:58
【问题描述】:

我在 SQL 数据库中有下表,

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 月至 2014 年)开始收集借方和贷方的总和,循环应以当前系统月份结束,即 9 月至 15 日

【问题讨论】:

  • 你尝试了什么?发布您的代码。会对您更好,因为我们将能够以准确的方式为您提供帮助
  • select Acct_no , (select sum (amount)from XYZ where Acct_no = '001234' and date = (select extract month from date)))Sep from XYZ where acid = '001234'

标签: mysql sql oracle-sqldeveloper


【解决方案1】:

这是一个纯 SQL 解决方案,包括基于您的数据的创建表语句。

设置如下:

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

【讨论】:

    【解决方案2】:

    您应该尽量避免在 SQL 中循环。 SQL 基于离散数学,因此您应该始终尝试集合操作。

    要解决您的问题,您应该按帐号、日期然后是借记或贷记类型列进行分组。然后,在您的主要选择中,您应该对您的金额列进行求和,并将您的日期仅转换为月份值。当涉及超过一年的重叠时要小心,您可能希望在输出中添加一年列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多