Sql 如何比较empName和Value?

Sql 如何比较empName和Value?,sql,vba,ms-access-2010,Sql,Vba,Ms Access 2010,早上好 情况是这样的:有一列信用卡交易,列出员工姓名和a.k.a借记的费用金额。在同一列中,它还列出了雇员姓名,其金额为相等的负数,表示该帐户的贷方 我要做的是找到员工姓名和费用金额。然后在列表中循环查找相应的负数 For example: John Doe, $100 Jane Doe, $200 Sam Smith, $300 John Doe, -$100 运行此模块时,结果应返回Jane Doe和Sam Smith的姓名,因为只有John Doe的记录同时具有正值和负值 我已经

早上好

情况是这样的:有一列信用卡交易,列出员工姓名和a.k.a借记的费用金额。在同一列中,它还列出了雇员姓名,其金额为相等的负数,表示该帐户的贷方

我要做的是找到员工姓名和费用金额。然后在列表中循环查找相应的负数

For example: 
John Doe, $100 
Jane Doe, $200 
Sam Smith, $300 
John Doe, -$100

运行此模块时,结果应返回Jane Doe和Sam Smith的姓名,因为只有John Doe的记录同时具有正值和负值

我已经非常接近于一个答案,但当存在重复值时,解决方案就会崩溃

For example: 

John Doe, $100 
John Doe, $100 
John Doe, -$100
在这个解决方案中,结果应该是John Doe,$100

到目前为止,我已经尝试过Access、VBA和SQL,但还没有找到答案

对于解决方案,我并不真正关心它是否意味着添加另一个对象(如表或查询)来执行比较部分。最后,我需要查看匹配和不匹配的员工姓名和值的列表

此外,我考虑在我的表中添加一列,该列具有布尔逻辑以显示两个“匹配”记录,因为这将是一个数据库,并且我们不一定要从主表中删除匹配的行


提前谢谢

我假设您的表有一个主键(我称之为
TransactionID
,并假设它是长整数-根据需要调整以下代码),在这种情况下,我将创建一个
tblMatches
,其中包含列
DebitID
CreditID
,以记录绑定的条目对。要填充此表,请执行以下操作:

Dim rsDebits As Recordset
Dim lngCreditID as Long

Set rsDebits = CurrentDb.OpenRecordset ("SELECT * FROM tblTransactions " & _
               "WHERE ChargeAmount > 0 And TransactionID Not In " & _
               "(SELECT DebitID From tblMatches)")

Do While Not rsDebits.EOF
    lngCreditID = Nz(DMin("TransactionID", "tblTransactions", _
                       "EmpName = '" & rsDebits!EmpName & "' And " _
                       "ChargeAmount = " & -rsDebits!ChargeAmount & " And " _
                       "TransactionID Not In (SELECT CreditID From tblMatches)"), 0)
    If lngCreditID > 0 Then
        CurrentDb.Execute "INSERT INTO tblMatches (DebitID, CreditID) " & _
                          "VALUES (" & rsDebits!TransactionID & ", " & lngCreditID & ")"
    End If
    rsDebits.MoveNext
Loop

Set rsDebit = Nothing
您现在可以编写一个查询,将此
tblMatches
连接到
tblTransactions
(两次,一次在tblTransactions.TransactionID=tblMatches.DebitID上连接
,另一次在tblTransactions.TransactionID=tblMatches.CreditID
)上连接,以显示匹配的所有不同条目。要获得不匹配项的列表,您需要按照

SELECT * FROM tblTransactions
WHERE TransactionID Not In (Select DebitID From tblMatches)
    And TransactionID Not In (Select CreditID From tblMatches)

您可以添加一个已清除的布尔字段,然后在VBA中运行一个简单循环,将匹配的记录集标记为已清除:

Public Function ClearTransactions()

    Dim db  As DAO.Database
    Dim rs1 As DAO.Recordset
    Dim rs2 As DAO.Recordset

    Dim Criteria As String

    Set db = CurrentDb

    Set rs1 = db.OpenRecordset("Select * From Transaction Where Value > 0 And Cleared = False Order By Id")
    Set rs2 = db.OpenRecordset("Select * From Transaction Where Value < 0 And Cleared = False Order By Id")

    While Not rs1.EOF
        Criteria = _
            "Id > " & rs1!Id.Value & " And " & _
            "EmpName = '" & rs1!EmpName.Value & "' And " & _
            "Value = " & Str(-rs1!Value.Value) & " And " & _
            "Cleared = False"
        rs2.FindFirst Criteria
        If rs2.NoMatch = False Then
            rs1.Edit
                rs1!Cleared.Value = True
            rs1.Update
            rs2.Edit
                rs2!Cleared.Value = True
            rs2.Update
        End If
        rs1.MoveNext
    Wend
    rs2.Close
    rs1.Close

    Set rs2 = Nothing
    Set rs1 = Nothing
    Set db = Nothing

End Function
公共函数ClearTransactions() Dim数据库作为DAO.Database 作为DAO.Recordset的Dim rs1 作为DAO.Recordset的Dim rs2 将标准设置为字符串 Set db=CurrentDb Set rs1=db.OpenRecordset(“从值大于0且清除=按Id错误排序的事务中选择*”) Set rs2=db.OpenRecordset(“从值<0且已清除=按Id错误排序的事务中选择*) 而不是rs1.EOF 标准=_ “Id>”&rs1!Id.值&“和”&_ “EmpName=”&rs1!EmpName.Value&“和”&_ “Value=“&Str(-rs1!Value.Value)&”和“&”_ “清除=错误” rs2.FindFirst标准 如果rs2.NoMatch=False,则 rs1.编辑 rs1!清除。值=真 rs1.更新 rs2.编辑 rs2!清除。值=真 rs2.更新 如果结束 rs1.MoveNext 温德 rs2.关闭 rs1.关闭 设置rs2=无 设置rs1=无 Set db=Nothing 端函数
在MS Access中很难做到这一点(很多事情也是如此)。您可以切换到功能更强大的数据库吗?当存在重复值时,匹配的业务规则是什么?这不是一个实现问题,而是一个设计问题。“当你运行这个模块时,你的结果应该返回Jane Doe和Sam Smith的名字,因为只有John Doe的记录同时具有正值和负值。”-难道“你”不应该是“我”和“你的”不应该是“我的”?Gordon Linoff-不应该在Access中使用查询、SQL或VBA进行操作。