给定发票数据库,其中还包括取消发票(=信用票据或CN)。 我想选择 已取消的 发票进行举报。 要从信用票据到原始发票,我们假设客户&金额匹配。 问题:有多个CN落在creiteria上方,所以我需要找到每个取消的原件。 例如。如果有5个CN,那么我们可以找到6个原始发票,其中5个应该被标记,假设最近的一个有效(没有最新的标志)。
我的声明,用于识别信用票据,后面称为" CancelInvs" (CN是是/否标志)
SELECT * FROM Invoices WHERE CN
以下简单地查找已取消的发票,但如果存在多个取消,则只会找到一个原件,每个附加CN重复多次。
SELECT Min(InvNum) FROM Invoices
INNER JOIN CancelInvs ON Invoices.Customer = CancelInvs.Customer AND Invoices.Amount = CancelInvs.Amount
GROUP BY CancelInvs.InvNum
我还需要找到被标记为已取消的其他人。如果需要,添加VBA没问题。谢谢你的关注。
示例数据: sample data img
Invoices和CreditNotes在同一张表中。为简单起见,我将两个数量都视为正数。 通过匹配CN取消的那些应被标记。有效的不需要标记。 CN可以在多于一个匹配发票之前。在这种情况下,只有第一个被标记。
在示例中,记录1400是CreditNote。之前唯一的发票,具有匹配的参数是记录1003.因此,1003将被标记为'已取消'。 下一个CN是1580.前面的发票,匹配字段是1412,因此1412应标记为'已取消'。 1003已经退出游戏。没有更多未使用的CreditNotes,因此不再标记发票。
答案 0 :(得分:0)
InvNum
是主键,是发票的唯一标识符吗?然后让CN表有一个字段来保存该值。这将让你JOIN
以一种体面的方式。
SELECT InvNum FROM Invoices
INNER JOIN CancelInvs
ON Invoices.InvNum = CancelInvs.InvNum
您必须有办法正确识别CN的原件。通常,这将是InvNum
,作为外键存储在CN中。没有它,您一直在使用Customer和Amount。但是那个组合不会让你肯定地识别出原作。因此,你无法做你想做的事。
答案 1 :(得分:0)
让我们离开吧。事实证明太复杂如此简单选择查询无法处理。决定使用tmp表进行vba循环并管理标记。谢谢大家。
由于这个现实生活任务的性质,最终使用了一个非常复杂的程序。我的SQL包括VBA控制的自适应参数。只是为了给出一个见解,这里是一个过程(以人类友好的脚本的形式)。
Begin cycle
Count and collect matching Invoices per CreditNote (criteria: same repairer & customer & amount, not cancelled)
Flag lines in collection table as 'Duplicate' where same Invoice appears for several CNs
Process the 1-1 matches by flagging Invoices as 'Cancelled'
Flag the processed CNs as 'Done', in CN matches collection table
If there are no 1-1 matches, allow multiple matches for CNs for one cycle - find earliest occurence of Invoice matches
Loop cycle while any matches remain
Drop any unpaired CN