【问题标题】:MS Access query to calc commission by monthMS Access 查询按月计算佣金
【发布时间】:2015-09-03 15:10:17
【问题描述】:

这篇文章很长,我希望它有意义,我感谢任何帮助!

我需要在 Access 中建立一个用于计算销售佣金的数据库。佣金百分比在服务的第一年按月变化,之后保持不变。

我一直在努力编写查询/子查询来处理这个问题。

每月支付的佣金率需要能够随时间变化以反映业务需求,并且由于数据库保存历史数据,因此需要对每次销售应用正确的费率。

我有以下表格:

  • 员工 - 员工 ID、名字、姓氏、开始日期
  • 销售 - EmployeeID、SalesDate、Amount
  • 目标 - MonthsOfService、CommissionRate、StartDate(即当费率 介绍)

Targets 表包含 MonthsOfService、CommissionRate 和 StartDate 的以下内容

  • 1, 0%, 01/01/2014
  • 2, 2.5%, 01/01/2014
  • 3, 5%, 01/01/2014
  • 4...
  • 5...
  • 12, 15%, 01/01/2014(=此比率适用于所有后续 个月)
  • 1 1%,2015 年 1 月 1 日(=从此日期开始应用第 1 个月的新费率)
  • 2 3%,2015 年 1 月 1 日

我想做的是创建一个查询来计算销售的员工服务月数,然后通过选择与服务月匹配的所有费率并选择 Max date less 来根据 SalesDate 选择适当的佣金率比销售日期。如果员工的服务月份 > 上个月录入,则需要使用上个月录入的费率 - 例如如果定义了 12 个月,则使用第 12 个月,如果定义了 15 个月,则使用第 15 个月。

谢谢

【问题讨论】:

  • 这可能需要几个查询才能完成。首先,您需要确定要使用的佣金值。如果您正在查看历史记录,您需要找到在销售日期之前发生的佣金值的最大日期。然后使用该查询将佣金值与目标表匹配,然后添加连接的员工和销售。此外,您应该重新考虑重命名您的“StartDate”字段之一。拥有其中两个会使事情变得混乱。

标签: ms-access subquery


【解决方案1】:

首先让我说,在 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 

【讨论】:

  • 感谢您非常彻底的回复。我需要更详细地再次解决这个问题,以便我完全理解这种方法。一个最初的问题 - 虽然佣金结构目前定义为 12 个月,但我想创建一个灵活的解决方案,其中“12”不是硬编码的,即它总是采用目标表中定义的最后一个“服务月”使用。您将如何修改上述内容来做到这一点?
  • 如果之前的一组目标费率为 12 个月,我会养成始终使用 12 个月的习惯。它极大地简化了计算。因此,例如,如果您的费率计划实际上停止在 9 个月,您仍将一直输入到 12,只需使用与 9 个月相同的费率值。试图在 9 点停止,尤其是在之前的费率可能会更高的情况下,这会给您带来很多麻烦,您可以轻松避免。
  • 好的,谢谢,我认为这是有道理的。我现在已经详细了解了这一点,我无法理解查询 3 中的内部连接(为什么它们都是必需的)以及“与”部分
  • 内连接连接 1.employee 表和sales 表,这样就可以得到用户及其销售信息。由于我们实际上并没有加入表目标,我们需要一种方法来过滤我们需要的佣金率。这就是“AND”的用武之地。 2. 我们对 Targets 表和 Query2 进行内部连接。这将我们的结果限制为仅包含 Targets 表中具有适用销售数据的记录。附加的“AND”执行此过滤器并将正确的记录“链接”回 Employee 和 Sales 表。希望能提供理想的最终结果。
猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多