2011-07-15 11 views

答えて

1

が、SQL Server(または任意の標準SQLデータベースシステム)のために:

SELECT 
    ID, 
    Status 
FROM 
    temp 
ORDER BY 
    CASE Status 
     WHEN 'completed' THEN 1 
     WHEN 'approved' THEN 2 
     WHEN 'paid' THEN 3 
     WHEN 'cancel' THEN 4 
    END 

その他の懸念 -

1)それはノーだので、この質問のタイトルは、誤解を招くように見えます全くBY GROUPについてトン、および、

2)私はあなたにもUNIONについて誤解をしていると思います - 結果はUNIONまたはUNION ALLから返される順序の保証はありません - UNION場合、がありそうですは、サーバーが重複を排除するのに役立つソート操作ですが、どのソートが実行されるかはサーバーによって決まります。このようなソートは常に必要なものではありません。 UNION ALLの場合、最初のクエリが大量のクエリであり、多くのI/Oを必要とし、2番目のクエリが些細なものである(たとえば、必要なすべてのデータが既にメモリに格納されている)サーバーの明白な最適化は、最初のI/Oを実行している間に2番目のクエリの結果を返すことです。

+0

おかげで友人はうまく働いています。 –

1

あなたが任意の行を注文しようとしているので、あなたはORDER BY句でCASEステートメントを使用することができます。ここではあなたに(SQL Serverの場合)あなたが探しているの出力が得られます作業例です:

ダンの答えとほぼ同じ
DECLARE @myTable AS TABLE([ID] INT, [Status] VARCHAR(16)) 
INSERT INTO @myTable VALUES(1, 'completed') 
INSERT INTO @myTable VALUES(2, 'approved') 
INSERT INTO @myTable VALUES(3, 'paid') 
INSERT INTO @myTable VALUES(4, 'cancel') 
INSERT INTO @myTable VALUES(5, 'approved') 
INSERT INTO @myTable VALUES(6, 'paid') 

SELECT * 
FROM @myTable 
ORDER BY 
    CASE [ID] 
     WHEN 1 THEN 1 
     WHEN 2 THEN 2 
     WHEN 3 THEN 4 
     WHEN 4 THEN 5 
     WHEN 5 THEN 3 
     WHEN 6 THEN 6 
     ELSE 999 
    END 
0
select ID, 
     [Status] 
from Temp 
order by case [Status] 
      when 'completed' then 1 
      when 'approved' then 2 
      when 'paid'  then 3 
      when 'cancel' then 4 
      else 5 
     end, ID 
+0

ありがとうございました。 –