首先让我说,在 Access 中编写 SQL 并不是我的强项。所以我使用三个 Access 查询来做到这一点。虽然这可能不是处理此问题的最有效方法,但希望使用三个单独的查询来解释我正在做的事情背后的方法比将它们全部混合到一个查询中更清楚一些。
查询 1:确定每次销售的月数,并将其连接到佣金表。我们会进行第一次过滤并排除销售日期之后的任何佣金变化。这将创建比我们需要的更多的记录,但我们稍后会过滤它们。
SELECT Employees.StartDate AS Emp_StartDate, Targets.StartDate AS Tar_StartDate, sales.SalesDate, Employees.EmployeeID, Targets.MonthsOfService
FROM Targets, sales INNER JOIN Employees ON sales.EmployeeID = Employees.EmployeeID
WHERE (((Targets.StartDate)<=[sales].[salesDate]) AND ((Targets.MonthsOfService)=IIf(DateDiff("m",[Employees].[StartDate],[sales].[SalesDate])>12,12,DateDiff("m",[Employees].[StartDate],[sales].[SalesDate]))))
查询 2:现在我们过滤掉记录。仅检索销售日期之前每个销售和佣金记录的最大日期。
SELECT Query1.Emp_StartDate, Max(Query1.Tar_StartDate) AS MaxOfTar_StartDate, Query1.SalesDate, Query1.EmployeeID, Query1.MonthsOfService
FROM Query1
GROUP BY Query1.Emp_StartDate, Query1.SalesDate, Query1.EmployeeID, Query1.MonthsOfService;
查询 3:现在我们将结果与原始表结合起来,为员工提供他们的销售数据和最适用的佣金数据。
SELECT Employees.FirstName, Employees.LastName, Employees.StartDate, sales.SalesDate, sales.amount, Targets.CommissionRate
FROM ((Query2INNER JOIN Employees ON Query2.EmployeeID = Employees.EmployeeID) INNER JOIN sales ON (Query2.SalesDate = sales.SalesDate) AND (Employees.EmployeeID = sales.EmployeeID)) INNER JOIN Targets ON (Query2.MonthsOfService = Targets.MonthsOfService) AND (Query2.MaxOfTar_StartDate = Targets.StartDate);
如果你用 SQL 来编写它,它看起来像下面的查询。这在 Access 中不起作用,但我只是想了解如果在 SQL 中的一个查询中完成它会是什么样子
SELECT Employees.FirstName,
Employees.LastName,
Employees.StartDate,
Sales.SalesDate,
Sales.Amount,
Targets.CommissionRate
FROM Employees, Targets
INNER JOIN Sales
ON Sales.EmployeeID = Employees.EmployeeID
INNER JOIN (SELECT CommissionQuery.Emp_StartDate,
Max(CommissionQuery.Tar_StartDate) MaxOfTar_StartDate,
CommissionQuery.SalesDate,
CommissionQuery.EmployeeID,
CommissionQuery.MonthsOfService
FROM (SELECT Employees.StartDate Emp_StartDate,
Targets.StartDate Tar_StartDate,
sales.SalesDate,
Employees.EmployeeID,
Targets.MonthsOfService
FROM Targets, sales
INNER JOIN Employees
ON sales.EmployeeID = Employees.EmployeeID
WHERE Targets.StartDate <= [sales].[salesDate]
AND Targets.MonthsOfService)=IIf(DateDiff("m",[Employees].[StartDate],[sales].[SalesDate])>12,12,DateDiff("m",[Employees].[StartDate],[sales].[SalesDate]
) CommissionQuery
GROUP BY CommissionQuery.Emp_StartDate, CommissionQuery.SalesDate, CommissionQuery.EmployeeID, CommissionQuery.MonthsOfService;
) MaxCommission
ON MaxCommission.SalesDate = Sales.SalesDate
AND MaxCommission.MaxofTar_StartDate = Targets.StartDate