(アドバンテージ データベース サーバー) 監査目的で決して削除されないサービス プロバイダーのテーブルがあります。開始日と終了日があります。名前や住所などの変更の場合、既存の行に終了日が付けられ、新しい行が作成され、変更されたデータに新しい開始日が割り当てられます。
これらのプロバイダーへの支払いの処理中に、プロバイダー名、住所、識別子 (ProvID)、および支払総額を一覧表示する概要ページが必要です。これは、SUM() と GROUP BY を使用したかなり単純なクエリで実行されます。
この問題は、指定されたプロバイダー ID に 2 つ以上の行がある場合に発生します。行が重複してしまいます (キャッチされない場合、そのプロバイダーへの複数の支払いが発生する可能性があります)。
私が最初に考えたのは、サブセレクトのようなもの (醜いが、かなり速く実行される) を使用することでした:
SELECT ... FROM service s
INNER JOIN provider p ON p.ProvID = s.ProvID
AND (p.EndDate IS NULL or p.EndDate = (SELECT Max(EndDate) FROM
provider lu WHERE lu.ProvID = s.ProvID))
残念ながら、これでも 2 つの行が見つかりました。NULL の EndDate 用に 1 行、MAX(EndDate) 用に 1 行。
他の場合 (たとえば、特定の日付に提供されるサービスの適切な ProvID を見つける) では、これを処理します。
p.EndDate is null or (s.ServiceDate BETWEEN p.StartDate AND p.EndDate)
残念ながら、問題のクエリは集計を使用した GROUP BY であるため、運行日は利用できません。
助言がありますか?
編集:私が探しているのは、存在する場合は NULL EndDate を持つ行、または NULL 行が存在しない場合は Max(EndDate) を持つ行です。これは、たとえば、サプライヤーが昨日解雇されたが、先週は働いていた場合をカバーしており、来週には支払いを行う予定です。