このSQLFiddleを参照してください:http ://sqlfiddle.com/#!2/9db4f
表「rate」は、ジョブロールの時間単位のチャージアウトレートを格納し、クライアントの会社、グループ(「グループ」は会社の単なる部門)、およびクライアントの連絡先に基づいてロールのさまざまなレートを格納するオプションがあります。
料金も時間とともに変化する可能性があります。
役割、会社、グループ、連絡先の特定の組み合わせに対して、最新の最適なレートを1つ選択したいと思います。次の順序で一致を試みる必要があります。
- client_contact、client_group、client_companyおよびrole
- client_group、client_companyおよびrole
- client_companyと役割
- ただの役割
例:レートマッチングの役割ID 3、会社ID 3、クライアントID4を探しています。
これらすべてに一致するレコードはないため、ロールID3と会社ID3だけに一致するレコードを探す必要があります(他のフィールド(client_contactとclient_group)はNULLである必要があります)。それらの2つがあります:行IDの2と3。最新の「date_from」日付を持っているので、行ID3を選択する必要があります。
別の例:役割ID3と会社ID25に一致するレートを探しています。どちらも存在しないため、役割ID 3だけに一致するものを探し、他のすべての値にはNULLを探す必要があります。一致する行は1つだけです:番号1。
現在のSQLFiddleのクエリは、'最新の'ビットをフェッチしますが、オプションの列が存在する場合は、それを一致させることに固執しています。
ハルプ:(
編集:おっと、SQLFiddleはスキーマのみを保存し、クエリは保存しないようです。これは私が持っているものです:
SELECT
rate.*
FROM
rate
LEFT JOIN rate AS newest ON (
rate.role = newest.role
AND COALESCE(rate.client_company, 1) = COALESCE(newest.client_company, 1)
AND COALESCE(rate.client_group, 1) = COALESCE(newest.client_group, 1)
AND COALESCE(rate.client_contact, 1) = COALESCE(newest.client_contact, 1)
AND newest.date_from > rate.date_from
)
WHERE newest.id IS NULL