【问题标题】:How manage validity range date in Ms Access database如何在 Ms Access 数据库中管理有效范围日期
【发布时间】:2020-05-07 05:59:20
【问题描述】:

我需要您的帮助以在 MS Access 中进行查询。

我有两张桌子:

  • 一个叫做 Tblvalrules 的有部门代码、规则的有效日期和申请该开始日期的规则。这意味着从 2018 年 1 月 1 日开始的 Dep01 将应用规则 1,而从 2020 年 1 月 1 日开始的 Dep01 将始终应用规则 2。
  • 另一个名为 TblMovement 的表,其中包含日期和部门。

我想要一个查询,添加一个列 Ruletoapply,该列基于 TblMovement 在 Tblvalrules 上搜索的 dep 和日期,并添加要应用的正确规则

下面是表格示例以便更好地理解

Tblvalrules

Dep    |  ValidityDateFrom | Rule  | 
------------------------------------
Dep001 |   1/1/2018        | rule1 | 
Dep001 |   1/1/2020        | rule2 | 
Dep002 |   1/1/2016        | rule3 | 
Dep003 |   1/1/2018        | rule4 | 
Dep003 |   1/1/2020        | rule5 |

TblMovement

Date       | Dep    | **Ruletoapply**
------------------------------------
02/01/2018 | Dep001 | **rule1**
02/01/2019 | Dep003 | **rule4**
06/06/2020 | Dep003 | **rule5**

如果您对数据库设计有一些建议,也提前感谢您

【问题讨论】:

  • 日期是 2 月 1 日还是 1 月 2 日?

标签: database ms-access


【解决方案1】:

首先连接表并聚合以找到TblMovement的每一行的ValidityDateFrom,然后将结果连接到Tblvalrules以获得正确的Rule

select t.Date, t.Dep, r.Rule as Ruletoapply
from (
  select m.Date, m.Dep, max(v.ValidityDateFrom) as ValidityDateFrom
  from TblMovement as m left join Tblvalrules v 
  on v.Dep = m.Dep and v.ValidityDateFrom <= m.Date 
  group by m.Date, m.Dep
) as t inner join Tblvalrules as r 
on r.ValidityDateFrom = t.ValidityDateFrom and r.Dep = t.Dep

结果:

Date        Dep     Ruletoapply
2/1/2018    Dep001  rule 1
2/1/2019    Dep003  rule 4
6/6/2020    Dep003  rule 5

【讨论】:

  • 如果您能帮助我,请只写一个注释。如果 TblMovement 包含重复值,例如另一个条目 02/01/2018 | Dep001 |是否有可能管理它,因为在那种情况下我会错过一行 TblMovement?我想在没有组查询的情况下获得 TblMovement 中的所有详细信息。谢谢
  • 你的意思是 Tblvalrules 吗?
  • 在 TblMovement 我可以有重复的日期和重复的 Dep
  • 您将需要另一个联接,这会使查询变慢:select m.Date, m.Dep, t.Ruletoapply from TblMovement as m left join ( select t.Date, t.Dep, r.Rule as Ruletoapply from ( select m.Date, m.Dep, max(v.ValidityDateFrom) as ValidityDateFrom from TblMovement as m left join Tblvalrules v on v.Dep = m.Dep and v.ValidityDateFrom &lt;= m.Date group by m.Date, m.Dep ) as t inner join Tblvalrules as r on r.ValidityDateFrom = t.ValidityDateFrom and r.Dep = t.Dep ) as t on t.Date = m.Date and t.Dep = m.Dep
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2017-06-08
相关资源
最近更新 更多