【问题标题】:Query for effective date based on related table values根据相关表值查询生效日期
【发布时间】:2016-10-31 03:45:16
【问题描述】:

我很难找出一个针对与存储有效日期的表相关的表中的记录的查询。

假设我有这三个表:

tblProjects
-----------
id 

tblTickets
----------
id 
projectID 
ticketNumber
ticketDate

tblRates
--------
id
projectID
effectiveDate
payRate

我要做的是创建一个查询,根据 ticketDate 测试 Rates 表的 EffectiveDate,并找到

所以 tblTickets 可能有:

id      projectId        ticketDate        ticketNumber
-----------------------------------------------------------
1            1            2016/08/11            990
2            1            2016/09/12            991
3            1            2016/10/22            992
4            1            2016/10/23            993
5            2            2016/08/15            750
6            2            2016/09/08            751

和 tblRates 可能有:

id      projectId        effectiveDate        Rate
-----------------------------------------------------------
1            1            2016/08/01          $50  
2            1            2016/10/01          $75
3            2            2016/06/01          $65

如果我要查询 projectId = 1 的所有票证,我希望看到如下内容:

projectId        ticketNumber        TicketDate            Rate
------------------------------------------------------------------------
    1                 990            2016/08/11            $50
    1                 991            2016/09/12            $50
    1                 992            2016/10/12            $75
    1                 993            2016/10/23            $75

我什至不确定从哪里开始。我可以查询有效日期的最大值,但在上面的示例中只会返回 10/12 和 10/23 记录。我还可以简单地查询

非常感谢您朝正确的方向轻推!

编辑: 这是我当前的查询。它返回每个 Rates 的所有记录的副本。

SELECT 
      vRates.projectId
    , tblTickets.TicketNumber
    , tblTickets.TicketDate
    , vRates.Rate
    , vRates.effectiveDate

FROM (
     ( SELECT  
              vTempRates.effectiveFrom
            , vTempRates.projectId
            , vRates.Rate
      FROM    tblRates AS vTempRates 
      INNER JOIN
            ( SELECT  
                  projectId
                , MAX(effectiveFrom) AS effectiveDate
                , Rate
              FROM  tblRates
              GROUP BY projectId, Rate
            ) AS vRates
      ON vTempRates.projectId = vRates.projectId 
            AND vTempRates.effectiveFrom = vRates.effectiveDate

     ) AS vRates 
       INNER JOIN tblProjects 
          ON vRates.projectId = tblProjects.id) 
       INNER JOIN tblTickets 
          ON tblProjects.id = tblTickets.projectId
WHERE (((tblProjects.id)=1));

【问题讨论】:

  • 你使用的是什么数据库(包括版本)?
  • MS Access 2010 和 SQL Server 2016 之间的混合体。不过,我正在 Access 中编写查询。

标签: sql sql-server ms-access


【解决方案1】:

访问 2013

select      t.*
           ,(select top 1 r.Rate from tblRates r where r.projectid = t.projectid and r.effectiveDate <= t.ticketDate order by r.effectiveDate desc) as Rate
from        tblTickets      t   
where       t.projectid = 1
;

【讨论】:

  • @user2170742,请自行检查。我刚刚在 Access 2013 上验证了答案的正确性,它工作正常。
  • 我将把它标记为正确,即使这在 Access 2010 中对我不起作用。也许他们在 2013 年改变了一些东西,但我决定改变我的方法并使用 T-SQL通过 ADODB 代替。使用这种方法就像一种魅力。谢谢。
【解决方案2】:

所以我解决了你的问题,我想如果我是正确的,那么使用以下方法很容易做到这一点:

Select effectivedate from Rates R join Projects p on R.projectId= p.id join 
Tickets T on T.projectId = p.id where
effectivedate<= t.ticketdate
order by effectivedate desc
limit 1;

这个查询基本上会选择对应的生效日期。现在 order by 子句将根据您采用的生效日期对输出进行排序,格式为最新到最晚,然后限制 1 将仅返回最新日期。

此外,如果您想要最近 3 个最新日期,您可以随时增加 limit 关键字中的数字,如下所示:

limit 3

这将返回最近 3 个最新日期。

我希望这是有用的。

【讨论】:

  • 这不只是返回最近的有效日期吗?例如。如果有效日期是 2016/09/01 2016/10/31 它将返回 2016/10/31,无论ticketDate 是否是 2016/09/25...
  • 我只得到最近两张使用这个返回的票。不返回前两个(根据示例:990 和 991)。
【解决方案3】:
SELECT tic.projectId projectId,tic.ticketNumber ticketNumber , tic.ticketDate ticketDate ,(SELECT top 1 Rate FROM tblRates WHERE ticketDate  >= effectiveDate AND tblRates.projectId = Tic.projectId ORDER BY effectiveDate DESC) Rate
FROM tblTickets  Tic WHERE Tic.projectId = 1 

【讨论】:

  • 不幸的是,这个和@Dudu 的答案都不起作用——至少在 Access 中不起作用。它显然不喜欢 tblTickets 不包含在子查询 SELECT 语句中......
  • 一切正常。仅在子查询中使用 tblTickets 列
  • 我不断收到错误消息:Microsoft Access 数据库引擎无法将“tblTickets.ticketDate”识别为有效的字段名称或表达式。如果我删除该 SELECT 语句,查询就会运行。如果我将 FROM 语句更改为: FROM tblRates INNER JOIN tblTickets ON tblRates.projectId = tblTickets.projectId 我收到一个错误:“此子查询最多可以返回一条记录”
  • @Mansoor:应该可以,但您可能必须使用“AS”语法:FROM tblTickets AS Tic.. AS Rate
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2017-03-23
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多