我有两个表:
工资单:
工资单ID | 工资扣减 | 工资单日期 | 员工姓名|
---|---|---|---|
1 | 计算 | 2022年5月29日 | ABC |
2 | 计算 | 2022年4月29日 | ABC|
3 | 计算 | 2022年3月29日 | ABC|
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