【问题标题】:How can I return multiple columns in a column subquery in Access 2003 JET SQL?如何在 Access 2003 JET SQL 的列子查询中返回多个列?
【发布时间】:2011-12-08 18:34:41
【问题描述】:

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

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 期间运行我的计算函数时,这意味着我不必针对每个查询 metrics日期范围内的行。

如果你能告诉我如何编写一个查询,它将自动将records 中的列除以metrics 中的相应列,那么我可以直接填充字段。

【问题讨论】:

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


    【解决方案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 是一个保留字,因此对于几乎任何东西来说都是一个糟糕的名称。

    选择 * 很少是个好主意,您应该使用字段(列)名称。

    【讨论】:

    • 这个看起来不错,我下午有机会试试。数据不以类别类型存储,每一列都是它自己的类别。不是最佳实践,但它最初是在匆忙中构建的...打算将修复保存为“2.0”
    • 这里唯一的问题是 Round() 函数中的参数抱怨“指定的字段'records.Productivity'可能引用SQL语句的FROM子句中列出的多个表' ,但只要我有相关的指标,我就可以在 VBA 中自己进行计算,如果我删除计算的字段,查询就可以工作。
    • 嗯,虽然查询在数据表视图中有效,但任何在报表控件中引用命名字段的尝试都会导致与上述相同的错误。
    • @4AM 问题源于未指定要包含的字段。如果您发布自己的 SQL,即从上面修改的 SQL,作为对原始帖子的编辑,我可能会提供帮助。
    • @4AM 我想当我终于发现即使是非常简单的 SQL 和 VBA 也能做些什么时,我感到有点头晕 :) 如果您还不熟悉别名,请查看它们,它们真的很干净向上 SQL:SELECT MyReallyLongTable.Field1 FROM MyReallyLongTable 变为 SELECT m.Field1 FROM MyReallyLongTable m
    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多