MS Access查询-如何仅根据输入日期定义日期范围



MS Access Query-如何仅根据输入日期定义日期范围

你好,我有一张表格,展示了审批流程中的步骤。

ID   |OriginalID|   OraclePricelistName |Change           |ItemNumber| Modified | Approval|PCTask | OESTask
2363 |  5,529   |   price_list1         | No              | Item1    |2020-06-09| Approved|No task|No task
2352 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-09| Approved|Ready  |Ready
2332 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-09| Approved|Ready  |Pending
2325 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-08| Approved|Pending|Pending
2312 |  5,529   |   price_list1         |Workflow running | Item1    |2020-06-08| Pending |Pending|Pending
14422|  5,529   |   price_list1         |No               | Item1    |2020-01-15| Approved|No task|No task
14419|  5,529   |   price_list1         |Workflow running | Item1    |2020-01-15| Approved|Ready  |No task
14184|  5,529   |   price_list1         |Workflow running | Item1    |2020-01-14| Approved|Pending|Pending
14121|  5,529   |   price_list1         |Workflow running | Item1    |2020-01-13| Pending |Pending|Pending
11434|  5,529   |   price_list1         |No               | Item1    |2019-12-27| Approved|No task|No task

我的任务是创建一个查询,显示工作流的每个步骤何时完成,并根据输入日期过滤结果。我已经设法创建了查询的一部分,该部分确定了每个步骤的完成日期。但是,我很难仅通过输入日期来指定范围。我知道,当"更改"列的状态从"否"变为"工作流正在运行"时,每个新范围都会开始,当它变回"否"时,就会结束。我尝试使用别名列并按它们进行筛选,但没有成功。

PARAMETERS [CheckDate] DateTime;
SELECT DISTINCT archive_prices.ID, archive_prices.OriginalID, archive_prices.OraclePricelistName, archive_prices.Change, archive_prices.ItemNumber, archive_prices.CustomerItemNumber, archive_prices.Currency, archive_prices.Modified, archive_prices.Created, archive_prices.Approval, archive_prices.CSSTask, archive_prices.PCTask, archive_prices.OESTask, archive_prices.CSTask, archive_prices.MultiYear,
IIF([Change]='Workflow running' AND [Approval]='Pending' AND [PCTask]='Pending' AND [OESTask]='Pending',[Modified],'Blank') AS UpdateDate,
IIF([Approval]='Approved' AND [PCTask]='Pending' AND [OESTask]='Pending',[Modified],'Blank') AS ApprovalDate,
IIF([PCTask]='Ready' AND [OESTask]='Pending',[Modified],'Blank' ) AS OracleUpdate,
IIF([OESTask]='Ready',[Modified],'Blank') AS BacklogUpdate, 

IIF([Change]='No',[Modified],"Blank") AS CompletedTask,
IIF([Change]='Workflow running',[Modified],"Blank") AS WorkflowTask,
IIF([CheckDate]>=Nz([CompletedTask]),1,IIF([CheckDate]>=Nz([WorkflowTask]),1,0)) AS Range

FROM archive_prices
WHERE (((archive_prices.OraclePricelistName)=[PriceList]) AND ((archive_prices.ItemNumber)=[PartNumber]))
ORDER BY archive_prices.Modified;

如果我在CheckDate参数中输入日期为2020年10月6日,则查询应给出以下结果:

ID  OriginalID  OraclePricelistName Change  ItemNumber  Modified    Approval    PCTask  OESTask UpdateDate  ApprovalDate    OracleUpdate    BacklogUpdate
2352    5,529   price_list1 Workflow running    Item1   2020-06-09  Approved    Ready   Ready       Null        Null         Null             2020-06-09
2332    5,529   price_list1 Workflow running    Item1   2020-06-09  Approved    Ready   Pending     Null        Null         2020-06-09       Null
2325    5,529   price_list1 Workflow running    Item1   2020-06-08  Approved    Pending Pending     Null        2020-06-08   Null             Null
2312    5,529   price_list1 Workflow running    Item1   2020-06-08  Pending Pending Pending     2020-06-08  Null         Null             Null

如果我输入日期为2020年10月1日,则查询应显示:

ID  OriginalID  OraclePricelistName Change  ItemNumber  Modified    Approval    PCTask  OESTask UpdateDate  ApprovalDate    OracleUpdate    BacklogUpdate
14419   5,529   price_list1 Workflow running    Item1   2020-01-15  Approved    Ready   No task     Null      Null            2020-01-15        Null
14184   5,529   price_list1 Workflow running    Item1   2020-01-14  Approved    Pending Pending     Null      2020-01-14      Null              Null
14121   5,529   price_list1 Workflow running    Item1   2020-01-13  Pending Pending Pending       2020-01-13  Null            Null              Null

我是新手,所以在这种情况下,我的方法很可能是错误的,我希望你能帮助我找到正确的方法。提前感谢!

由于您是新手,我建议您按部分进行,如下所示:

假设ID是自动编号和递增的,您可以创建名为"的第一个查询;Q1";像

Select OraclePricelistName, max(ID) from archive_prices GROUP BY OraclePricelistName HAVING change = "Workflow running"

以上内容将为您提供OraclePricelistName的最后一个ID,该ID是更改开始的位置。

然后你做第二个查询("Q2"(为:

Select OraclePricelistName, max(ID) from archive_prices GROUP BY OraclePricelistName HAVING change = "no"

以上内容将为您提供OraclePricelistName完成更改的最后一个ID。

然后你做

Select Q1.*, Q2.* from Q1 LEFT JOIN Q2 ON Q1.OraclePricelistName = Q2.OraclePricelistName

以上将显示您需要的数据。请注意,当Q2.id低于Q1.id时,表示已开始更改,但尚未关闭。

最新更新