2011-07-31 7 views
1

GOLD,SILVER,ACTIVEまたはINACTIVEのいずれかのテーブルがあります。異なる値によるSQL Serverの注文

この順番で並べ替えて、トップXを取得したいと思います。どのようにしてクエリに書き込むことができますか?

あなたが良いとされた場合は現在、私はあなたが、など、その後SILVERを照会して、再度サイズをチェックし、

答えて

13
SELECT TOP X * 
FROM myTable 
ORDER BY 
    CASE 
     WHEN Status = 'GOLD' THEN 4 
     WHEN Status = 'SILVER' THEN 3 
     WHEN Status = 'ACTIVE' THEN 2 
     WHEN Status = 'INACTIVE' THEN 1 
    END DESC 
+1

+1は素晴らしい作品 - 他のオプションが可能なステータス値のための独立したルックアップテーブルを持っており、そのルックアップテーブルに –

+0

@marc_sを注文のシーケンスを定義するには、次のようになります。絶対に。私はほとんどそれを思いついたが、水を泥だらけにしたくなかった。 –

+0

私はこの素早く簡単な解決法が好きです。ありがとうたくさん:) – Jesper

5

GOLDするための第1のクエリでリストをいっぱいにして、リストのサイズをチェックしています

statusvalues 
id displaytext sortorder 
1 GOLD  10 
2 SILVER  20 
3 ACTIVE  30 
4 INACTIVE 40 

次に、メインテーブルにステータス値としてIDを格納します。メインテーブルからこのテーブルに結合して、displaytextとsortorderを取得し、適切にソートします。

NB 1ソート順にギャップが残るため、別のものを挿入する必要がある場合は、たとえば、他の値を変更する必要はありません。 NB 2これは、お客様が「GOLD」が「PREMIUM」と表示されるはずであると判断した場合、データ項目の値を1つ変更し、コードは変更されません。あなたに多くの時間を節約するかもしれない...! しかし、これは過度の可能性があります - あなたが評価するまで。

+0

+1。これは、フレキシブルな発注を行うためのより一般的な方法です。 –

+0

'id'カラムを4バイトのintにしないでください。それを1バイトのtinyintにするか、単に' WidgetStatusCode'を呼び出してchar(1)にしてください。 –

+0

私はそれをcharにしません。それを数字にすると、もしあなたが本当に賢いなら、 "if WidgetStatus <3 ..."やビット単位の操作のような便利なことができます。 –

-1

これは誰かを助けるかもしれません。 'StatusTypes'テーブルの外部キーとして列(StatusTypeID)を持つテーブル(MyTable)があるとします。このような動的ソートを行うプロシージャを実装できます。

CREATE PROCEDURE DynamicSort(@SortOrder int) 
AS 
BEGIN 

SELECT * FROM MyTable 
ORDER BY 
CASE WHEN StatusTypeID = @SortOrder then 1 
END 

DESC 

END 
-- exec DynamicSort 7 
関連する問題