Sql 如何比较empName和Value?
早上好 情况是这样的:有一列信用卡交易,列出员工姓名和a.k.a借记的费用金额。在同一列中,它还列出了雇员姓名,其金额为相等的负数,表示该帐户的贷方 我要做的是找到员工姓名和费用金额。然后在列表中循环查找相应的负数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的记录同时具有正值和负值 我已经
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进行操作。