2016-10-19 13 views
2

複数の一時テーブルを使用してレポートを生成する必要があるため、このケースステートメントをカプセル化してクエリを短くする必要があります。私はcase文をどこで使っても構いません。ステートメントをカプセル化して序文で使用する方法

Select * from #SumED_DB 
order by case 
when [type] = 'Within 30 days' then 1 
when [type] = 'Within 60 days' then 2 
when [type] = 'Within 90 days' then 3 
when [type] = 'Within 120 days' then 4 
when [type] = 'Greater than 120 days' then 5 
when [type] = 'Blank' then 6 
else 7 
end 

この問題を解決するにはどうすればよいですか?私は機能が私を助けることを知っているが、私はそれをどのように達成するのだろうか?

私は私のクエリは次のようになりたい:私はテーブルを使用し、それに参加し、その後、ORDER BY句を使用していまし

select * from #SumED_DB order by (function); 

。 関数を使用してこれを行うにはどうすればよいですか?

答えて

2

あなたの注文のために参加するルックアップテーブルを作成する以外に、私は関数または繰り返しコードが唯一の他のオプションだと思います。一般的には、各行に対して別々の呼び出しを生成するだけでなく、クエリのパフォーマンスを低下させるので、関数の呼び出しを避けたいとします。they also prohibit parallelism

データセットが常に小さなサマリーテーブルになる場合は、名前付け規則と要件に基づいているように見えますが、これはおそらく大きなトレードオフではありません。

あなたの関数を作成するには:

create function dbo.usp_TypeOrder (@Type nvarchar(100)) 
returns int 
as 
begin 
return (select case @Type 
       when 'Within 30 days' then 1 
       when 'Within 60 days' then 2 
       when 'Within 90 days' then 3 
       when 'Within 120 days' then 4 
       when 'Greater than 120 days' then 5 
       when 'Blank' then 6 
       else 7 
       end 
     ) 
end; 

をし、あなたのクエリでそれを使用する:

私は必要なシーケンスまたは持っている別のテーブルへの参加、のために行く必要がありますオプション
select * 
from #SumED_DB 
order by dbo.usp_TypeOrder([type]); 
+0

パフォーマンスワイズ上記の機能? – Ruchi

+0

パフォーマンスの賢明なオプション私は、必要なシーケンスまたは上記の機能を持つ別のテーブルに参加する必要がありますか? – Ruchi

+1

@ルチあなた自身の環境でこれをテストし、両方を作成し、どちらが良いかを確認する必要があります。何を探すべきかわからない場合は、https://www.brentozar.com/sql/sql-server-performance-tuning/のセクション2の情報を読むことを強くお勧めします。 – iamdave

関連する問題