[英]DB2 for IBM i (AS400) - SQL
两个表A(每日贷款交易表)和B(每日eod贷款余额表)。
尝试在DB2 AS400中编写一条select语句以显示所选日期范围内的每日贷款交易,eod贷款余额和期初贷款余额(前一天)。
下面的查询将给我每日贷款交易和eod贷款余额。 但在修改以下查询时也需要一些帮助,以针对所选的日期范围2015年3月1日至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余额,并且应该是一个工作日。
任何想法将不胜感激。
谢谢!
这对您有用吗?
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实例。
编辑进行了修改,以允许在评论中提到周末。
这是使用“日历”或“日期”表可以轻松完成的众多任务之一。
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.