示例数据集
TransID FieldA FieldB FieldC Amount Status
001 John Doe Sr 1.00 Hold
002 John Doe Sr -1.00 Hold
003 John Doe Sr 1.00 Hold
Status
是唯一未锁定在数据集中的字段。它是三个价值观的枚举; "保持" (默认),"已批准"和"拒绝"。
TransID
是一个独特的字段。
我的目标
我想自动批准任何"无效"交易。因此,我想自动批准'上面的交易001和002,但将003留在' hold'员工手动审核的状态。
我的代码
不幸的是,我没有正常运行的代码来解决此问题。而是寻找关于使用什么逻辑的一些指导。
第1部分:显然我在Access中需要一个UPDATE查询来执行Status的更改。我不太担心那部分。
第2部分:我如何识别"无效"记录?
第2a部分:我可以根据FieldA
,FieldB
,FieldC
查找重复记录。
第2b部分:但那又怎么样?我应该使用什么逻辑来检查另一条记录的Amount
是否为{(Amount
* -1)?
第2c部分:即使我能识别这些记录,我怎么才会批准"无效"记录?即,Trans 001和003都属于2b部分的标准,那么我怎么才会批准其中一个(可能使用SELECT TOP 1
?)但是如果有多个"无效"记录?即,Trans
004和005与002和003完全相同?
我对这一点感到有点难过。任何有关逻辑的帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我不明白为什么通过SQL无法解决这个问题。
Trans 1和2可以更新为"已批准"如果可以做出一些假设。
如果净出并且应该被批准的交易的TransID具有比不应该被批准的TransID更低的TransID。
多对" netting"事务不会发生在同一个人身上,或者它是重复运行更新查询直到它不再更新记录的合理解决方案。
以下是一个查询,它将使用名称匹配且金额为零的最小TransID更新事务对。
UPDATE [Table1]
SET [Status] = "Approved"
WHERE [TransID] = (
SELECT a.minTransID
FROM (Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
FROM Table1
Where Amount > 0
Group By FieldA, FieldB, FieldC, Amount
) a
INNER JOIN (
Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
FROM Table1
Where Amount < 0 and Status = "Hold"
Group By FieldA, FieldB, FieldC, Amount
) b on a.FieldA = b.FieldA and a.FieldB = b.FieldB and a.FieldC = b.FieldC
)
OR [TransID] =(
SELECT B.minTransID
FROM (Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
FROM Table1
Where Amount > 0
Group By FieldA, FieldB, FieldC, Amount
) a
INNER JOIN (
Select Min(TransID) as minTransID, FieldA, FieldB, FieldC, Amount
FROM Table1
Where Amount < 0 and Status = "Hold"
Group By FieldA, FieldB, FieldC, Amount
) b on a.FieldA = b.FieldA and a.FieldB = b.FieldB and a.FieldC = b.FieldC
)