受控多个结果在Access SQL中。查找所有n个匹配项

时间:2016-03-30 16:38:41

标签: sql vba ms-access

给定发票数据库,其中还包括取消发票(=信用票据或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,因此不再标记发票。

2 个答案:

答案 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