当且仅当另一个字段具有特定值时,您如何检查查询中的字段是否具有特定值?
How do you check a field in a query for specific values if and only if another field had a specific value?
我想在我的 Access 查询中写一个表达式来检查我们 运行 下周 宁 的项目是否有 运行 4 周 该日期之前。我无法理解如何在同一个查询中检查某些内容,然后使用该检查的 returned 值来检查更多内容。我试过的方法是编写另一个查询,该查询将使用第一个查询的结果(其中 7/20/2015
中的项目被隔离)来检查这些项目的日期,但我 运行 进入问题,因为那时我必须将该查询与原始 table 联系起来,这会重复数据。
用伪代码编写,看起来有点像下面这样:
如果 item
的 job_date
为 7/20/2015
,请检查该项目在 7/20/2015
之前的所有实例,如果在 [=16] 周内没有实例=]、7/6/2015
、6/29/2015
或 6/22/2015
,然后 return item
。
以更直观的方式编写:
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
项目 A 不会被 returned 因为我们一直在 运行ning 连续。项目 B 会 return,因为即使我们 运行 它是在 6/15/2015
上发布的,那也比 7/20/2015
早了 4 个多星期。 Item D
不会 return 因为它没有包含目标日期 (7/20/2015
) 的行。
备注:
理想情况下,我将使用始终自动确定下周日期的表达式,为了清楚起见,我在这里使用了硬日期。如果你也想使用硬日期,请随意。
我们的周从星期一开始。
一个项目可以在一周内 运行 多次。例如,Item C
可以有 2 行 7/13/2015
和 7/13/2015
。作业编号(未显示,但存在于同一 table 中)是 table 中的唯一标识符。如果 Item C
是 运行 两次,那么作业将是 H000001584-0030
和 H00001584A-0030
。
下面的查询 return 当我提供 7/20/2015 作为参数值时,此结果集来自您的示例数据:
item
----
B
查询包括一个子查询,其中 returns 那些在目标日期之前的 28 天内具有 job_date 值的行的项目。请注意,子查询没有 return 一个 item,它在该范围内没有 job_date 值 --- 所以它给出你只有那些在那个范围内确实有 job_date 的项目。因此,离开加入子查询并仅询问 "right side" 为 Null 的行意味着我们从最终结果集中排除这些项目。
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;
我想在我的 Access 查询中写一个表达式来检查我们 运行 下周 宁 的项目是否有 运行 4 周 该日期之前。我无法理解如何在同一个查询中检查某些内容,然后使用该检查的 returned 值来检查更多内容。我试过的方法是编写另一个查询,该查询将使用第一个查询的结果(其中 7/20/2015
中的项目被隔离)来检查这些项目的日期,但我 运行 进入问题,因为那时我必须将该查询与原始 table 联系起来,这会重复数据。
用伪代码编写,看起来有点像下面这样:
如果 item
的 job_date
为 7/20/2015
,请检查该项目在 7/20/2015
之前的所有实例,如果在 [=16] 周内没有实例=]、7/6/2015
、6/29/2015
或 6/22/2015
,然后 return item
。
以更直观的方式编写:
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
项目 A 不会被 returned 因为我们一直在 运行ning 连续。项目 B 会 return,因为即使我们 运行 它是在 6/15/2015
上发布的,那也比 7/20/2015
早了 4 个多星期。 Item D
不会 return 因为它没有包含目标日期 (7/20/2015
) 的行。
备注:
理想情况下,我将使用始终自动确定下周日期的表达式,为了清楚起见,我在这里使用了硬日期。如果你也想使用硬日期,请随意。
我们的周从星期一开始。
一个项目可以在一周内 运行 多次。例如,
Item C
可以有 2 行7/13/2015
和7/13/2015
。作业编号(未显示,但存在于同一 table 中)是 table 中的唯一标识符。如果Item C
是 运行 两次,那么作业将是H000001584-0030
和H00001584A-0030
。
下面的查询 return 当我提供 7/20/2015 作为参数值时,此结果集来自您的示例数据:
item
----
B
查询包括一个子查询,其中 returns 那些在目标日期之前的 28 天内具有 job_date 值的行的项目。请注意,子查询没有 return 一个 item,它在该范围内没有 job_date 值 --- 所以它给出你只有那些在那个范围内确实有 job_date 的项目。因此,离开加入子查询并仅询问 "right side" 为 Null 的行意味着我们从最终结果集中排除这些项目。
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;