2011-07-15 28 views
3

表溫度SQL Server組

ID Status 
1 completed 
2 approved 
3 paid 
4 cancel 
5 approved 
6 paid 

我想上面顯示的條記錄每以下表格,而無需使用union.because這是客戶的要求,所以請爲此提供幫助。

表溫度

ID Status 
1 completed 
2 approved 
5 approved 
3 paid 
6 paid 
4 cancel 

回答

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)這個問題的標題似乎是誤導性的,因爲它沒有t x關於GROUP BY可言,而且,

2)我覺得你有一種誤解,約UNION還 - 有沒有在這結果將返回從UNIONUNION ALL訂單的保證 - 在UNION情況下,有可能是一種排序操作,可幫助服務器消除重複項,但執行的排序完全取決於服務器,因此您不應該依賴這種排序。對於UNION ALL,想象一下,如果第一個查詢是一個大型查詢,需要大量的I/O,而第二個查詢是微不足道的(比如說,所有需要的數據都已經在內存中)。服務器的一個明顯的優化是返回第二個查詢的結果,同時它仍然執行第一個I/O。

+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

感謝朋友其工作正常。 –