当且仅当另一个字段具有特定值时,如何在查询中检查特定值的字段?

时间:2015-07-14 12:40:22

标签: date ms-access expression

我想在我的Access查询中编写一个表达式,以检查我们正在运行下周的项目是否在该日期之前的 4周中运行。我无法理解如何在同一查询中检查某些内容,然后使用该检查的返回值来检查更多内容。我尝试过的方法是编写另一个查询,该查询将使用第一个查询的结果(来自7/20/2015的项目被隔离)来检查这些项目的日期,但是我遇到了问题因为然后我必须将该查询绑定到原始表,该表复制数据。

用伪代码编写,看起来有点像:

如果item的{​​{1}}为job_date,请在7/20/2015之前检查该项目的所有实例,如果几周内没有实例7/20/20157/13/20157/6/20156/29/2015,然后返回6/22/2015

以更直观的方式撰写:

item

项目A不会被退回,因为我们一直在运行。项目B将返回,因为即使我们在item job_date A 6/22/2015 A 6/29/2015 A 7/6/2015 A 7/13/2015 A 7/20/2015 item job_date B 6/15/2015 B B B B B 7/20/2015 item job_date C 6/22/2015 C C C 7/13/2015 C 7/13/2015 C 7/20/2015 item job_date D D D D D D 上运行它,也就是6/15/2015之前超过4周。 7/20/2015不会返回,因为它没有包含目标日期(Item D)的行。

注意:

  • 理想情况下,我会使用能够自动确定下周某日期的表达式,为了清晰起见,我只是在这里使用了硬日期。如果你想使用硬日期,请随意。

  • 我们的星期几星期一开始。

  • 一个项目可以在一周内多次运行。例如,7/20/2015可以包含Item C7/13/2015的2行。作业编号(未显示,但存在于同一个表中)是表中的唯一标识符。如果7/13/2015要运行两次,则作业将为Item CH000001584-0030

1 个答案:

答案 0 :(得分:2)

当我提供 7/20/2015 作为参数值时,下面的查询会从您的示例数据中返回此结果集:

item
----
B

该查询包含一个子查询,该子查询返回在目标日期之前的28天内具有 job_date 值的行的项目。请注意,子查询不会返回,该项在该范围内没有 job_date 值 - 因此它只为您提供了具有 job_date的项目在那个范围内。因此,保持连接到子查询并仅询问“右侧”为空的行意味着我们从最终结果集中排除这些项。

PARAMETERS pTarget DateTime;
SELECT j.item
FROM
    dbo_job AS j
    LEFT JOIN
    (
        SELECT [item]
        FROM dbo_job
        WHERE job_date>=DateAdd('d', -28, [pTarget]) And job_date<[pTarget]
        GROUP BY [item]
    ) AS sub
    ON j.item = sub.item
WHERE j.job_date=[pTarget] AND sub.item Is Null
GROUP BY j.item;