表の一時ステータスクエリーの問題により、SQL Serverグループ
ID Status
1 completed
2 approved
3 paid
4 cancel
5 approved
6 paid
ので、このためにヘルプを提供してください、クライアントの要求です。
表の一時
ID Status
1 completed
2 approved
5 approved
3 paid
6 paid
4 cancel
表の一時ステータスクエリーの問題により、SQL Serverグループ
ID Status
1 completed
2 approved
3 paid
4 cancel
5 approved
6 paid
ので、このためにヘルプを提供してください、クライアントの要求です。
表の一時
ID Status
1 completed
2 approved
5 approved
3 paid
6 paid
4 cancel
が、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番目のクエリの結果を返すことです。
あなたが任意の行を注文しようとしているので、あなたは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
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
ありがとうございました。 –
おかげで友人はうまく働いています。 –