如何在Access 2003 JET SQL中的列子查询中返回多个列?

时间:2011-12-08 02:08:28

标签: sql select inner-join ms-access-2003 jet

我正在开展一个每天记录员工绩效指标的项目。

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中相应的列,那么我会感激不尽。所以我可以直接填充这些字段。

1 个答案:

答案 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是一个保留字,因此几乎可以说是一个可怕的名字。

选择*是非常好的主意,你应该使用字段(列)名称。