我在处理视图。我有一份有付款条件的定购单(30天,2期30天(30/60)等)和其他东西:
PO SUPPLIER DELIVERY_DATE PAYMENT_TERMS
1 A 2016-11-10 30 DAYS
2 B 2016-11-10 30/60 DAYS我想看一下付款时间表。由于许可,我不能使用表,只能使用视图,而且为此我遇到了很多麻烦(尝试了用于更新的物化视图,没有运气,因为ORACLE抛出的查询非常复杂)。
这就是我想要的:
PO SUPPLIER DELIVERY_DATE PAYMENT_TERMS PAYMENT_DATE AMOUNT
1 A 2016-11-10 30 DAYS 2016-12-10 100%
2 B 2016-11-10 30/60 DAYS 2016-12-10 50%
2 B 2016-11-10 30/60 DAYS 2017-01-10 50%有小费吗?
谢谢!
发布于 2016-10-07 18:42:42
那么,您似乎需要决定Payment_Terms的每个不同值真正意味着什么,因为没有内置的规则将" 30 /60天“解释为”30天后支付50%的一次付款,60天后再支付50%“。因此,我理解为什么查询太复杂,无法自动更新物化视图。具体来说,需要在输出中为一行输入创建多个行通常需要相对复杂的逻辑(使用UNION、花哨的JOIN语句等)。
您仍然可以使用物化视图,但是您需要自己强制刷新它(定期使用,或者在必要时使用触发器)。
无论哪种方式,获得所需内容的查询(多个查询之一)可能如下所示:
-- build the records for 30 DAYS
select po, supplier, delivery_date, payment_terms, (delivery_date + 30) as payment_date, 100 as amount
from The_Table
where payment_terms = '30 DAYS'
union all
-- build the records for the FIRST payment for 30/60
select po, supplier, delivery_date, payment_terms, (delivery_date + 30) as payment_date, 50 as amount
from The_Table
where payment_terms = '30/60 DAYS'
union all
-- build the records for the SECOND payment for 30/60
select po, supplier, delivery_date, payment_terms, (delivery_date + 60) as payment_date, 50 as amount
from The_Table
where payment_terms = '30/60 DAYS'希望这能有所帮助。
发布于 2016-10-07 19:54:56
下面的解决方案假设"30“是表示”月“的一种传统方法--所有计算都是基于月份而不是天数。如果“天”的字面意思是“天”,那么解决方案就很容易适应。我假设"payment_terms“标记总是完全按照您提供的格式(两种可能性之一),而第二个数字,如果它存在,则是第一个数字的确切倍数。我又增加了两行测试。我想不出为什么这不能变成一个快速的、可刷新的物化视图。(不确定是否要更新--您希望通过此视图更新哪些内容?)
注:如果最后一列中的百分比要用于进一步的计算,则不应该将它们变成字符串(以%符号结尾);相反,它们应该是数字,比如1.0000、0.3333或0.5000。
with
inputs ( po, supplier, delivery_date, payment_terms ) as (
select 1, 'A', date '2016-11-10', '30 DAYS' from dual union all
select 2, 'B', date '2016-11-10', '30/60 DAYS' from dual union all
select 3, 'C', date '2015-03-13', '90 DAYS' from dual union all
select 4, 'D', date '2015-10-01', '90/270 DAYS' from dual
),
prep ( po, supplier, delivery_date, payment_terms, freq, num ) as (
select po, supplier, delivery_date, payment_terms,
to_number(regexp_substr(payment_terms, '\d+', 1, 1)) / 30,
nvl(to_number(regexp_substr(payment_terms, '\d+', 1, 2)) /
to_number(regexp_substr(payment_terms, '\d+', 1, 1)), 1)
from inputs
)
select po, supplier, delivery_date, payment_terms,
add_months ( delivery_date, freq * level ) as payment_date,
to_char(100/num, '999.99') || '%' as payment_amount
from prep
connect by level <= num
and prior po = po
and prior sys_guid() is not null
order by po, payment_date
;
PO S DELIVERY_DATE PAYMENT_TERMS PAYMENT_DATE PAYMENT_AMOUNT
---------- - ------------- ------------- ------------ --------------
1 A 10-NOV-2016 30 DAYS 10-DEC-2016 100.00%
2 B 10-NOV-2016 30/60 DAYS 10-DEC-2016 50.00%
2 B 10-NOV-2016 30/60 DAYS 10-JAN-2017 50.00%
3 C 13-MAR-2015 90 DAYS 13-JUN-2015 100.00%
4 D 01-OCT-2015 90/270 DAYS 01-JAN-2016 33.33%
4 D 01-OCT-2015 90/270 DAYS 01-APR-2016 33.33%
4 D 01-OCT-2015 90/270 DAYS 01-JUL-2016 33.33%https://stackoverflow.com/questions/39923689
复制相似问题