过去两周我一直受到这个问题的折磨,不能再花上这么多时间了。如果你有一分钟,我很想听听这个社区的任何想法。我是自学成才,所以我必须用非专业的术语来解释这一点。谢谢你的考虑。
我的目标是获取非零余额的所有发票。这对于常规发票来说非常简单。问题出现在付款提醒中,因为他们的余额只是滞纳金,所以为了获取总余额,我必须通过连接表COLLECTIVEINVOICENO
中的单个字段链接回原始发票。
表INVOICE
的示例:
invoiceid | invoiceno | invoicetypename | amount
--------------|---------------|---------------------|--------------------
10008 | 123000 | Payment Reminder | 5
10005 | 113000 | Payment Reminder | 5
10001 | 110000 | Invoice | 35
COLLECTIVEINVOICENO
和10001
过期的表格10005
的示例:
invoiceid | followed_up_in (CHAR)
--------------|----------------------------------------------------------
10005 | 113000, 123000
10001 | 113000
我找到了一个非常糟糕的解决方案,它可以同时获取单个客户的分类帐,但是对资源要求很高,我无法在整个表INVOICE
上使用它:
select (
select sum(i.amount) as sum
from INVOICE i0
join COLLECTIVEINVOICENO cin0 on cin0.invoiceid = i0.invoiceid
where instr(cin0.followed_up_in, i.invoiceno) > 0
) as original_sum
from INVOICE i
此全表扫描在我的主select
中重复五次,以便将各种余额分类到不同的列中,并从原始发票中获取除其余额之外的其他数据,例如其位置等。
我的初衷是将子选项左键加入INVOICE i
作为视图,但Oracle在i.invoice
中无法识别instr(cin0.collectiveinvoiceno, i.invoice)
(ORA-00904:&# 34;我"。" INVOICENO":无效的标识符。)
我现在只能查看我目前正在做的游标等,但我真的想知道是否有任何关于它的SQL,非PL方式?
谢谢。
编辑:关于将逗号分隔的数据拆分为行,即。改变数据模型以促进关系:这肯定有助于我确定,但数据模型与第三方软件打包在一起,所以我无法做任何事情。 (如果他们确实在某些时候改变它,我不会感到惊讶,因为它表明最终用户是一个主要的弱点。)
编辑2:尝试使用带有regexp_substr()
和level
的{{1}}将逗号分隔数据拆分为行,并将此视图加入主表。我没有解决这个问题,因为当connect by
加入其他表时,regexp_substr()
资源非常昂贵,而且查询在半小时后也无法提供。 Google透露这是正则表达式的常见问题,建议尝试使用存储过程。
我已经更改了标题以反映这一点,我将对如何使用存储过程解决此问题的任何输入表示感谢。无论如何,谢谢!
答案 0 :(得分:1)
这可能会有所帮助。在使用主表格之前,它会使用followed_up_in
拆分以逗号分隔的xmltable
并将结果列表值展平为发票编号行。
select i0.invoiceid, sum(i0.amount)
from INVOICE i0
left outer join
( select invoice_id, trim(COLUMN_VALUE) invoiceno
FROM COLLECTIVEINVOICENO,
xmltable(('"' || REPLACE(followed_up_in, ',', '","') || '"'))
) cin0
on cin0.invoiceno = i0.invoiceno
and i0.invoiceid = cin0.invoiceid
group by i0.invoiceid