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日の変更まではうまくいきました。これで、各コードの 2 つの定義ができました。問題は、日付に応じて正しいコードを選択するクエリをどのように作成できるかです。

たとえば、日付が 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 に答える