この問題はSQL Join on Nearest Less Than Dateと似ているが、私の問題では解決できないということを前に説明します。 1つの列を選択する代わりに、最も近い日付に基づいて「フィルタリング」されたテーブルの結果が必要です。SQL関連テーブルの中で最も有効な日付を見つけよう
私は3つのテーブルを持っています。メインテーブルには、以下の形式のタイムチケットデータが含まれています。
ticketId
ticketNumber
ticketDate
projectId
セカンダリテーブルでは、プロジェクトの毎日のチケットの料金スケジュールが追跡されます。
scheduleId
projectId
effectiveDate
実際に該当するレートを含む2番目のテーブルもあります。このような何か:PROJECTID上の最初の2つのテーブルを結合
scheduleId
straightTime
overTime
は(明らかに)プロジェクトの料金表内のすべてのレコードのデータを複製します。私はプロジェクト1のための3つのレートのスケジュールを持っている場合は、チケットの記録は次のようになる:
私の結果にeffectiveDateを選択ticketNumber | ticketDate | projectId | effectiveDate | scheduleId
------------- | ------------ | ----------- | -------------- | ----------
1234 | 2016-06-18 | 25 | 2016-06-01 | 1
1234 | 2016-06-18 | 25 | 2016-06-15 | 2
1234 | 2016-06-18 | 25 | 2016-06-31 | 3
例に簡単です:
SELECT *
, (SELECT TOP 1 t1.effectiveFrom
FROM dbo.labourRateSchedule t1
WHERE t1.effectiveFrom <= t2.[date] and t1.projectId = t2.projectId
ORDER BY t1.effectiveFrom desc) as effectiveDate
FROM dbo.timeTicket t2
ORDER BY t.date
はしかし、私はする必要がありますdbo.labourRateScheduleのIDを3番目のテーブルに追加して、適用される実際のレートを取得することができます。 SELECTステートメントにt1.IDを追加しても、JOINから別の関連テーブルにアクセスすることはできません。
私はFROMステートメントでSELECTステートメントにJOINしようとしましたが、その結果は適用可能なticketDateに最も近い値ではなく、最後のeffectiveDate値でのみ発生します。
私はこれについてどんな助けにも大変感謝します!
をものにビットをクリアするために提供してください「第1、第2」の代わりにテーブル名を使用して、クエリを構造と比較することができます。 – Serg