2013-02-05 37 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