DB2 for IBM i(AS400) - SQL

时间:2015-03-31 21:14:11

标签: sql db2 ibm-midrange

两个表A(每日贷款交易表)和B(每日贷款余额表)。

尝试在DB2 AS400中编写一个select语句,以显示每日贷款交易,eod贷款余额和所选日期范围的贷款余额(前一天)。

以下查询将为我提供每日贷款交易和eod贷款余额。但是需要一些帮助来修改下面的查询来计算开始贷款余额(截至2015年2月28日的余额),日期范围为03/01/2015至03/31/2015。

select A.*, -- daily loan transactions
       B.EOD_Loan_Balance
from A 
  inner join B 
   on A.date_id = B.date_id 
    and A.Loan_num = B.Loan_num
where a.date_id between 03/01/2015 to 03/31/2015

请注意,前一天应该是营业日,所以如果2015年2月28日不是营业日,那么我们需要在此之前提取日期余额,这应该是工作日。

任何想法都会受到赞赏。

谢谢!

2 个答案:

答案 0 :(得分:1)

这对你有用吗?

select A.*, -- daily loan transactions
       B.EOD_Loan_Balance,
       C.EOD_Loan_Balance,
from A 
  inner join B 
   on A.date_id = B.date_id 
    and A.Loan_num = B.Loan_num
  LEFT OUTER join C
   on A.Loan_num = C.Loan_num
where a.date_id between '2015-03-01' to '2015-03-31'
and c.date_id = CASE 
                  WHEN DAYOFWEEK('2015-03-01') = 1 THEN '2015-03-01' - 2 days 'Sunday --> Friday
                  WHEN DAYOFWEEK('2015-03-01') = 2 THEN '2015-03-01' - 3 days 'Monday --> Friday
                  ELSE                                  '2015-03-01' - 1 day ' Previous day
                END

未经测试,因为我没有方便的DB2实例。

编辑修改为允许在评论中提及的周末。

答案 1 :(得分:1)

这是使用" calender"轻松完成的众多任务之一。或"日期"表...

select D.*,
       B.EOD_Loan_Balance,
       E.EOD_Loan_Balance,
from MY_CALENDAR_TABLE C
     join daily_trans D on c.date = d.date 
     join eod_bal B on c.date - 1 day= b.date and d.loan_num = b.loan_num
     join eod_bal E on c.date = e.date and d.loan_num = e.loan_num
where c.date between 2015-03-01 and 2015-03-31
  and c.is_business_day = 1;

<强> - 编辑 -
回想一下,我意识到它并不是很有效;从开始余额开始的加入不会给您提前 businsess日

幸运的是,日历表的灵活性得到了拯救。只需在日历表中添加PRIOR_BUSINESS_DAY列。

然后SQL变为:

select D.*,
       B.EOD_Loan_Balance,
       E.EOD_Loan_Balance,
from MY_CALENDAR_TABLE C
     join daily_trans D on c.date = d.date
     join eod_bal B on c.prior_buisiness_day = b.date 
           and d.loan_num = b.loan_num
     join eod_bal E on c.date = e.date
           and d.loan_num = e.loan_num
where c.date between 2015-03-01 and 2015-03-31
  and c.is_business_day = 1;