2015-03-31 95 views
0

两个表A(每日贷款交易表)和B(每日贷款余额表)。DB2 for IBM i(AS400) - SQL

试图在DB2 AS400中编写select语句来显示日期贷款交易,eod贷款余额和所选日期范围的开始贷款余额(前一日)。

下面的查询会给我每天的贷款交易和贷款余额。但需要一些帮助,修改下面的查询以计算2015年1月3日至2015年3月31日选定的日期范围内的期初贷款余额(平衡截至2015年2月28日)。

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日不是工作日,然后,我们需要在此之前,拉一天的EOD平衡,这应该是一个工作日。

任何想法,将不胜感激。

谢谢!

+0

为了澄清,你也想选择'EOD_Loan_Balance其中DATE_ID =( '2015年3月1日' - 1天)'。还是日期不连续? – Turophile 2015-03-31 21:23:24

+0

开始贷款余额即前一天的日均余额日期为03/01/2015即('2015-03-01' - 1天),并且应该是工作日。如果前一天不是工作日,那么必须从前一天获得差额余额。 – User221 2015-03-31 21:43:25

回答

1

这是一份很容易做一个“压延”或“日期”表中的许多任务之一......

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; 

- 编辑 -
回首这一点,我意识到它不太合适。从开始余额的加入不会给你之前的总计日

幸运的是,日历表的灵活性来解救。只需在日历表中包含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; 
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实例。

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

+0

以上提供的情况在以下情况下不起作用:1)如果以前一天存在EOD余额,那么今天发生的每日交易赢得; t显示。为了避免这种情况,如果使用Left join,那么我们不能在c.date_id的条件上应用。 2)如果前一天不是营业日 – User221 2015-03-31 22:51:32

+0

除了存在左外部连接的目的的情况外,它可以正常工作。因为使用where条件将左外连接到某个其他表作为内连接。例如:我希望看到每天的交易,甚至是前一天的工作日余额,不存在,可以通过左外部加入来实现,但可以通过C.date_id上​​的哪些条件不显示日常交易来实现。 – User221 2015-04-01 23:42:31

+0

如果您在一个工作日有一个月的假期会发生什么?预先制定日历表是处理这些问题的最佳方法。 – Charles 2015-04-02 00:51:31