我正在尝试创建一个查询,该查询将我们的Account表连接到与我们的还款表的一对多关系。我只想为每个帐户返回第一笔(基于日期)三笔待处理的还款。
因此,例如,如果我有以下简化数据:
loanaccount
encodedkey id
a1a1a1 a1
b2b2b2 b2
c3c3c3 c3
CREATE TABLE `loanaccount` (
`encodedkey` VARCHAR(32) NOT NULL,
`id` VARCHAR(32) NULL,
PRIMARY KEY (`encodedkey`));
INSERT INTO ``loanaccount` (`encodedkey`, `id`) VALUES ('a1a1a1',
'a1'),('b2b2b2', 'b2'),('c3c3c3', 'c3');
Repayment
encodedkey duedate principaldue interestdue parentaccountkey state
rep1 2018-01-01 7500 5000 a1a1a1 PENDING
rep2 2018-02-01 7500 4000 a1a1a1 PENDING
rep3 2018-03-01 6000 5000 a1a1a1 PENDING
rep4 2017-12-01 4000 4000 a1a1a1 PAID
rep5 2018-01-01 5000 6500 b2b2b2 PENDING
rep6 2018-04-01 6500 5000 b2b2b2 PENDING
rep7 2018-08-01 4000 3000 b2b2b2 PENDING
rep8 2018-09-01 3000 4000 b2b2b2 PENDING
rep9 2018-04-01 8000 4000 a1a1a1 PENDING
rep10 2018-02-01 3500 4000 c3c3c3 PENDING
CREATE TABLE `repayment` (
`encodedkey` VARCHAR(32) NOT NULL,
`duedate` DATE NULL,
`principaldue` DECIMAL(18,2) NULL,
`interestdue` DECIMAL(18,2) NULL,
`parentaccountkey` VARCHAR(32) NULL,
`state` VARCHAR(45) NULL,
PRIMARY KEY (`encodedkey`));
INSERT INTO repayment (encodedkey, duedate, principaldue, interestdue, parentaccountkey, state) VALUES
('rep1', '2018-01-01', '7500', '5000', 'a1a1a1', 'PENDING'),
('rep2', '2018-02-01', '7500', '4000', 'a1a1a1', 'PENDING'),
('rep3', '2018-03-01', '6000', '5000', 'a1a1a1', 'PENDING'),
('rep4', '2017-12-01', '4000', '4000', 'a1a1a1', 'PAID') ,
('rep5', '2018-01-01', '5000', '6500', 'b2b2b2', 'PENDING'),
('rep6', '2018-04-01', '6500', '5000', 'b2b2b2', 'PENDING'),
('rep7', '2018-08-01', '4000', '3000', 'b2b2b2', 'PENDING'),
('rep8', '2018-09-01', '3000', '4000', 'b2b2b2', 'PENDING'),
('rep9', '2018-04-01', '8000', '4000', 'a1a1a1', 'PENDING'),
('rep10','2018-02-01', '3500', '4000', 'c3c3c3', 'PENDING');
我希望展示的结果是:
loanaccount.id rep.duedate rep.principaldue rep.interestdue rep.state
a1 2018-01-01 7500 5000 PENDING
a1 2018-02-01 7500 4000 PENDING
a1 2018-03-01 6000 5000 PENDING
b2 2018-01-01 5000 6500 PENDING
b2 2018-04-01 6500 5000 PENDING
b2 2018-08-01 4000 3000 PENDING
c3 2018-02-01 3500 4000 PENDING
使用我在本网站其他地方找到的帮助,我创建了一个查询,它将返回最早的待处理还款。它看起来像这样:
select *
from loanaccount la
join (SELECT la.encodedkey
,la.id
, rep.duedate
,rep.PRINCIPALDUE
,rep.INTERESTDUE
from loanaccount la
JOIN (SELECT
rep.encodedkey
,rep.parentaccountkey
,min(rep.duedate) as MinDate
,rep.principaldue
,rep.interestdue
from repayment rep
where rep.state = 'PENDING'
group by rep.parentaccountkey
) MinDates on la.ENCODEDKEY = mindates.parentaccountkey
join repayment rep on mindates.parentaccountkey = rep.PARENTACCOUNTKEY
and mindates.mindate = rep.duedate
where rep.state = 'PENDING'
) repa on repa.id = la.id
我想做的是,从每个帐户的还款表中获取3个最早的duedates。还款不一定符合标准时间表 - 即不是所有月度或季度。
提前感谢您的帮助。
答案 0 :(得分:1)
E.g:
SELECT duedate
, principaldue
, interestdue
, state
FROM
( SELECT x.*
, CASE WHEN @prev = parentaccountkey THEN @i:=@i+1 ELSE @i:=1 END rank
, @prev:=parentaccountkey prev
FROM repayment x
, (SELECT @prev:=null,@i:=0) vars
WHERE state = 'pending'
ORDER
BY parentaccountkey
, duedate
) a
WHERE rank <= 3;
+------------+--------------+-------------+---------+
| duedate | principaldue | interestdue | state |
+------------+--------------+-------------+---------+
| 2018-01-01 | 7500.00 | 5000.00 | PENDING |
| 2018-02-01 | 7500.00 | 4000.00 | PENDING |
| 2018-03-01 | 6000.00 | 5000.00 | PENDING |
| 2018-01-01 | 5000.00 | 6500.00 | PENDING |
| 2018-04-01 | 6500.00 | 5000.00 | PENDING |
| 2018-08-01 | 4000.00 | 3000.00 | PENDING |
| 2018-02-01 | 3500.00 | 4000.00 | PENDING |
+------------+--------------+-------------+---------+
关于加入另一张桌子的一点是留给读者的练习