MS Access中的SQL(基于两个日期之间的辅助表中的数据加和+记录中的匹配名称)



我有两个表:

工资单:

员工姓名ABCABC
工资单ID 工资扣减 工资单日期
1 计算 2022年5月29日 ABC
2 计算 2022年4月29日
3 计算 2022年3月29日
4 计算 2022年2月28日 ABC

考虑DSum域聚合,它在MS Access中可用作表达式函数、VBA函数和SQL函数(前端GUI,但不是后端连接)。类似地,您可以在表达式参数中使用DLookUp(我在上一个问题中建议过)调用SUM()

具体来说,将其他表中的Salary Deduction列与对应的Employee Name相加,其中Deduction Date位于PaySlip Date的日期范围内,并且使用DateAdd后不到一个月。

表达式 (设置为[Salary PaySlip]表单设计中[Salary Deduction]文本框的控制源)

=DSum("[Deduction Amount]", 
"[Salary Deductions]", 
"[Employee Name] = '" & [Employee Name] & "' AND
[Deduction Date] >= #" & [PaySlip Date] & "#
AND <  #" & DateAdd("m", 1, [PaySlip Date]) & "#") 

VBA(通过编程计算控制源)

Forms![Salary PaySlip]![Salary Deduction] = DSum( _
"[Deduction Amount]", _
"[Salary Deductions]", _
"[Employee Name] = '" & Forms![Salary PaySlip]![Employee Name] & "' AND " _ 
& "[Deduction Date] >= #" & Forms![Salary PaySlip]![PaySlip Date] & "#" _
& "             AND <  #" & DateAdd("m", 1, Forms![Salary PaySlip]![PaySlip Date]) & "#" _
)

SQL

UPDATE(使用DSum将数据保存到表中-不能使用子查询)

UPDATE [Salary PaySlip] p
SET p.[Salary Deduction] = DSum(
"[Deduction Amount]", 
"[Salary Deductions]", 
"[Employee Name] = '" & p.[Employee Name] & "' AND
[Deduction Date] >= #" & p.[PaySlip Date] & "#
AND <  #" & DateAdd("m", 1, p.[PaySlip Date]) & "#"
) 

或者,您可以使用一个相关的聚合子查询,它可能会对足够大的数据产生性能问题。希望不久的将来,MS Access团队将为Access SQL方言添加对窗口函数的支持(根据SQL ANSI 2003)!

SELECT(使用相关聚合子查询)

SELECT p.[PaySlip ID],
(SELECT SUM([Deduction Amount])
FROM [Salary Deductions] d
WHERE d.[Employee Name] = p.[Employee Name]
AND d.[Deduction Date] >= p.[PaySlip Date]
AND <  DateAdd('m', 1, p.[PaySlip Date])
) AS [Salary Deduction],
p.[PaySlip Date]
p.[Employee Name]
FROM [Salary Payslips] p

最新更新