2013-02-05 39 views
3

我有一個查詢返回其他記錄狀態列。記錄狀態欄有多個值,如:「活動」,「刪除」,等等TSQL排序依據 - 硬編碼值列表

我需要按結果「活動」,然後選擇「刪除」,然後等...

我目前正在創建CTE來帶來每一組記錄,然後是UNION ALL。是否有更好的動態方法來完成查詢?

謝謝

回答

5

欲瞭解更多情況值,你可以這樣做:

WITH StatusOrders 
AS 
(
    SELECT StatusOrderID, StatusName 
    FROM (VALUES(1, 'Active'), 
       (2, 'Deleted'), 
       ... 
       n, 'last status')) AS Statuses(StatusOrderID, StatusName) 
) 
SELECT * 
FROM YourTable t 
INNER JOIN StatusOrders s ON t.StatusName = s.StatusName 
ORDER BY s.StatusOrderID; 
+0

馬哈茂德·您好,我得到一個錯誤:附近關鍵字「價值」不正確的語法。 – Bill

+0

@Bill - 你能告訴我你嘗試過的確切查詢嗎?它應該可以正常工作。請注意,這裏的'VALUES'的synatx在SQL Server 2008中是新的,如果你使用的是舊版本,它不會以這種方式工作,你將不得不''UNION ALL SELECT'的值。 –

3

你可以在這裏

ORDER BY CASE WHEN Status = 'Active' THEN 0 ELSE 1 END ASC 

使用CASE,但如果你有status更多的價值,並要排序Active然後DELETE

ORDER BY CASE WHEN Status = 'Active' THEN 0 
       WHEN Status = 'Deleted' THEN 1 
       ELSE 2 
     END ASC 
1
WITH 
cteRiskStatus 
AS 
(
SELECT RiskStatusID, RiskStatusName 
FROM (VALUES(1, 'Active'), 
       (2, 'Draft'), 
       (3, 'Occured'), 
       (4, 'Escalated'), 
       (5, 'Closed'), 
       (6, 'Expired'), 
       (7, 'Deleted')) AS RiskStatuses(RiskStatusID, RiskStatusName) 
) 
SELECT * FROM cteRiskStatus 

感謝

+0

我正在使用SQL Server 2008 R2 – Bill

+0

看來我正在使用SQL 2005的一個實例。我對上述2008 R2實例進行了上述嘗試,並且完美無缺!謝謝。 – Bill

+0

比爾,你需要通過調用來完成cte,以便它執行。 – Robino