異なるアドレスの注文の一覧があるとします。
各注文記録には、独自のステータスとサービス日付があります。
ステータスはint型の列挙型です。 「10」は提出を意味し、「2」は保留中、「3」は承認済み、「6」は完了していることなどを意味する「1,2,3,4,5,6,7,8,9,10」。
我々は、新しい注文の作成に前の注文のコンテンツを再利用する機能を持っています。この目的のために、現在の注文と同じ住所とサービスタイプを持つ最新の注文記録を見つける必要があります。
しかしもう一つ事があります。 注文ステータスに基づいて最新のレコードを見つける必要があります。まず、「完了」ステータスを持つ注文に興味があります。そのような注文がない場合は、「承認済み」ステータスの注文を検索したいと考えています。それから、「提出された」など。SQL Serverでレコードが見つかるまで追加の条件を適用してレコードを選択する
これまでのところ、私は次の解決策を作ってみた:
declare @date datetime = '2016-10-18';
declare @serviceType varchar(20) = 'delivery';
declare @zipCode int = 99999;
WITH cte AS (
SELECT * FROM Order AS O
WHERE O.serviceDate <= @date AND
O.serviceType = @serviceType AND
O.zipCode = @zipCode)
/* find order for content re-using */
SELECT TOP 1 * FROM cte
WHERE status =
CASE
WHEN 0 < (SELECT COUNT(1) FROM cte
WHERE Status = 6) /* completed */
THEN 6
WHEN 0 < (SELECT COUNT(1) FROM cte
WHERE Status = 3) /* approved */
THEN 3
WHEN 0 < (SELECT COUNT(1) FROM cte
WHERE Status = 2) /* pending */
THEN 2
WHEN 0 < (SELECT COUNT(1) FROM cte
WHERE Status = 10) /* submitted */
THEN 10
END
ORDER BY serviceDate DESC;
は、任意のより良い(より最適化された)解決策はありますか?
ここには改善の余地がありますが、テーブルのコンテキストなしでコードを提供することは不可能です。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
「最新の」注文を選択する際の優先順位は、serviceDateまたは注文ステータス?たとえば、昨日の注文に「4」のステータス(完了)があり、今日の注文に「3」のステータス(保留中)がある場合、その注文を「最新」として選択する必要がありますか? – JohnH
@ JohnH、注文状況が優先されます。 –