2

所以我有一个存储主键、描述和更新日期列的参考表。像这样的东西

SELECT * FROM tblReasonRef

ReasonCode   Description   UpdateDate
27           Lunch         2010-12-01
24           Meeting       2010-12-01
20           SpecialProj   2010-12-01

前几天,代码描述发生了变化。所以现在查询返回以下...

ReasonCode   Description   UpdateDate
27           Lunch         2010-12-01
24           Meeting       2010-12-01
20           SpecialProj   2010-12-01
27           Training      2012-06-22
24           Meeting       2012-06-22
20           Lunch         2012-06-22

源数据每 30 分钟跟踪一次员工可能进入的状态,因此您将有以下查询...

SELECT * FROM tblhActivity

MemberID     Date         Time    ReasonCode    ReasonDuration
10922        2012-06-21   1200    27            100
10922        2012-06-21   1500    24            1800
10922        2012-06-25   1230    27            100

所以最初,我的查询是......

SELECT a.MemberID, a.Date, a.Time, r.Description, a.ReasonDuration 
  FROM tblhActivity a
 INNER JOIN tblReasonRef r ON a.ReasonCode = r.ReasonCode

在 22 日更改之前一直运行良好。现在我对每个代码都有两个定义。问题是,如何创建一个根据日期选择正确代码的查询。

例如,我知道当日期是 21 日时,代码 27 的描述应该是午餐。25日,返回的描述应该是Training。

另请记住,在将代码添加到参考表中时,这可能会再次发生。我试图认为加入也应该在 UpdateDate 但我必须知道每个参考代码的开始和结束日期。有简单的解决方案吗?

4

2 回答 2

1

您确实需要特定原因适用期间的开始日期和结束日期。您可以修改您tblReasonRef的日期以包含这些日期(最佳选择),或者您需要计算它们。

以下查询将计算每个原因的结束日期作为ReasonCode添加新条目的前一天。

SELECT ReasonCode
    ,Description
    ,UpdateDate StartDate
    ,DATEADD(d, -1, UpdateDate) PreviousEntryEndDate
    ,ROW_NUMBER() OVER(PARTITION BY ReasonCode ORDER BY UpdateDate) AS Row 
INTO #reason
FROM tblReasonRef

SELECT a.MemberID
    ,a.Date
    ,a.Time
    ,reason.ReasonCode
    ,a.ReasonDuration
FROM tblhActivity a
    INNER JOIN #reason reason
        ON a.ReasonCode = reason.ReasonCode
    LEFT JOIN #reason nextReason
        ON reason.Row = nextReason.Row - 1
        AND reason.ReasonCode = nextReason.ReasonCode
WHERE a.Date BETWEEN reason.StartDate AND ISNULL(nextReason.PreviousEntryEndDate, a.Date)

DROP TABLE #reason
于 2012-06-26T00:30:38.753 回答
0

如果您修改表tblReasonRef,如下所示:

ReasonCode, Description, StarDate, EndDate

您可以执行以下 SQL 查询:

SELECT a.MemberID, a.Date, a.Time, r.Description, a.ReasonDuration 
FROM tblhActivity a
INNER JOIN tblReasonRef r ON a.ReasonCode = r.ReasonCode
WHERE a.Date between r.StartDate and r.EndDate

请记住,您需要简单的代码和模型。

于 2012-06-26T00:26:09.033 回答