我正在开展一个每天记录员工绩效指标的项目。
records
表每天保留一行员工的工作效率;每列保留在该类别中完成的项目数,加上总班次时间和作为短日期的日期。
metrics
表包含生效日期(短日期)和与records
表中生产率列相匹配的列,用于跟踪预期的每小时生产率。
employees
表只包含员工姓名和电话附加信息。
可以将员工报告设置为可变日期范围以显示一段时间内的绩效,并且GroupLevel(1).GroupOn
也可以通过VBA设置(按周,月,季等创建部分)。
此处的目标是创建一个查询,该查询返回记录表的所有行(稍后将根据打开报告时传递的whereCondition
进行过滤)以及metrics
的行最小日期小于或等于records.date
的表格。到目前为止,我只能获得metrics
行的ID(或任何其他单个字段):
SELECT records.*, employees.first, employees.last, employees.ext,
(
SELECT TOP 1 metrics.id
FROM metrics
WHERE metrics.date<=records.date
ORDER BY metrics.date DESC
) AS MetricsID
FROM employees
INNER JOIN records ON employees.id = records.employee
ORDER BY employees.last;
我正在寻找的是一种编写此查询的方法,因此我在每行中都有所有列 - 当我在GroupFooter2_Format
期间运行我的计算函数时,这意味着我不必查询{{1对于日期范围中的每一行。
如果你能告诉我如何编写一个查询会自动将metrics
中的列除以records
中相应的列,那么我会感激不尽。所以我可以直接填充这些字段。
答案 0 :(得分:1)
这些方面的东西可能适合:
SELECT Records.*, Metrics.*,
Round([Records].[Productivity]/[Metrics].[ExpectedRate],2) AS Calc,
Employees.First, Employees.Last
FROM ((Records
INNER JOIN
(SELECT records.ID,
(SELECT TOP 1 metrics.id
FROM metrics
WHERE metrics.date<=record.date
ORDER BY metrics.date DESC ) AS MetricsID
FROM records) AS j
ON Records.ID = j.ID)
INNER JOIN Metrics ON j.MetricsID = Metrics.ID)
INNER JOIN Employees ON Records.Employee = Employees.ID;
但是,我有点怀疑所提供的数据已经简化,因为你提到“在该类别中完成的项目”,但没有在记录表或指标表中提及类别ID。
此外,date
是一个保留字,因此几乎可以说是一个可怕的名字。
选择*是非常好的主意,你应该使用字段(列)名称。