

图自网络 不代表订阅号立场







SQL> with invoices as2 (select a.cust_num,3 a.inv_num,4 a.val,5 sum(a.val) over(partition by a.cust_num order by a.inv_num) tval,6 row_number() over(partition by a.cust_num order by a.inv_num) rn7 from demo_invoices a),8 receipts as9 (select b.cust_num,10 b.rec_num,11 b.val,12 sum(b.val) over(partition by b.cust_num order by b.rec_num) tval,13 row_number() over(partition by b.cust_num order by b.rec_num) rn14 from demo_receipts b)15 select i.cust_num, i.inv_num, i.val, r.rec_num, r.val16 from invoices i, receipts r17 where i.cust_num = r.cust_num18 start with i.rn = 119 and r.rn = 120 connect by i.cust_num = prior i.cust_num21 and (prior i.tval > prior r.tval and i.rn = prior i.rn and22 r.rn = prior r.rn + 1 or23 prior i.tval < prior r.tval and i.rn = prior i.rn + 1 and24 r.rn = prior r.rn or25 prior i.tval = prior r.tval and i.rn = prior i.rn + 1 and26 r.rn = prior r.rn + 1);CUST_NUM INV_NUM VAL REC_NUM VAL-------- ------- ---------- ---------- ----------A 发票1 300 收款1 100A 发票1 300 收款2 600A 发票2 100 收款2 600A 发票3 200 收款2 600A 发票4 500 收款2 600A 发票4 500 收款3 300A 发票4 500 收款4 100A 发票5 100 收款5 200A 发票6 100 收款5 200B 发票1 200 收款1 100B 发票1 200 收款2 600B 发票2 400 收款2 600B 发票3 100 收款2 600B 发票4 400 收款3 300B 发票4 400 收款4 100
至此我们至少已经排列出了两边单据的匹配关系,不过在计算核销额之前,我想先说一说语句里 CONNECT BY 条件的简化
i.rn = prior i.rn + 1 + least(sign(prior r.tval - prior i.tval), 0) andr.rn = prior r.rn + 1 + least(sign(prior i.tval - prior r.tval), 0)







casewhen rtval <= itval thenleast(rtval - (itval - ival), rval)when rtval > itval thenleast(itval - (rtval - rval), ival)end
这也是一个“直译”的表达式,大家看上面也是 least,下面也是 least,如果把四个值搁在一块儿 least 行不行呢
least(r.tval - (i.tval - i.val), r.val, i.tval - (r.tval - r.val), i.val)
彳 亍


SQL> with invoices as2 (select a.cust_num,3 a.inv_num,4 a.val,5 sum(a.val) over(partition by a.cust_num order by a.inv_num) tval,6 row_number() over(partition by a.cust_num order by a.inv_num) rn7 from demo_invoices a),8 receipts as9 (select b.cust_num,10 b.rec_num,11 b.val,12 sum(b.val) over(partition by b.cust_num order by b.rec_num) tval,13 row_number() over(partition by b.cust_num order by b.rec_num) rn14 from demo_receipts b)15 select i.cust_num,16 i.inv_num,17 i.val,18 r.rec_num,19 r.val,20 least(r.tval - (i.tval - i.val),21 r.val,22 i.tval - (r.tval - r.val),23 i.val) aval24 from invoices i, receipts r25 where i.cust_num = r.cust_num26 start with i.rn = 127 and r.rn = 128 connect by i.rn = prior29 i.rn + 1 + least(sign(prior r.tval - prior i.tval), 0)30 and r.rn = prior31 r.rn + 1 + least(sign(prior i.tval - prior r.tval), 0)32 and i.cust_num = prior i.cust_num;CUST_NUM INV_NUM VAL REC_NUM VAL AVAL-------- ------- ---------- ---------- ---------- ----------A 发票1 300 收款1 100 100A 发票1 300 收款2 600 200A 发票2 100 收款2 600 100A 发票3 200 收款2 600 200A 发票4 500 收款2 600 100A 发票4 500 收款3 300 300A 发票4 500 收款4 100 100A 发票5 100 收款5 200 100A 发票6 100 收款5 200 100B 发票1 200 收款1 100 100B 发票1 200 收款2 600 100B 发票2 400 收款2 600 400B 发票3 100 收款2 600 100B 发票4 400 收款3 300 300B 发票4 400 收款4 100 100


文章转载自SQL干货分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




