Sql server SQL Server按不同值排序

Sql server SQL Server按不同值排序,sql-server,sql-order-by,Sql Server,Sql Order By,我有一个表,其中的状态可以是黄金,白银,活动或非活动 我想按这个分类。。。按照这个顺序,取前X。我怎么能在我的查询中写这个呢 目前,我正在填写一个列表,首先查询黄金,然后检查列表的大小,然后查询白银,然后再次检查大小等。如果你表现良好,你应该将其标准化为一个单独的表: SELECT TOP X * FROM myTable ORDER BY CASE WHEN Status = 'GOLD' THEN 4 WHEN Status = 'SILVER' THEN 3

我有一个表,其中的
状态可以是
黄金
白银
活动
非活动

我想按这个分类。。。按照这个顺序,取前X。我怎么能在我的查询中写这个呢


目前,我正在填写一个列表,首先查询
黄金
,然后检查列表的大小,然后查询
白银
,然后再次检查大小等。

如果你表现良好,你应该将其标准化为一个单独的表:

SELECT TOP X *
FROM myTable
ORDER BY
  CASE
       WHEN Status = 'GOLD' THEN 4
       WHEN Status = 'SILVER' THEN 3
       WHEN Status = 'ACTIVE'  THEN 2
       WHEN Status = 'INACTIVE' THEN 1
  END DESC
statusvalues
id   displaytext sortorder
1    GOLD        10
2    SILVER      20
3    ACTIVE      30
4    INACTIVE    40
然后将id作为您的状态值存储在主表中。从主表连接到此表,以获取displaytext和sortorder,并进行适当排序

注1:我在排序顺序中留有间隙,因此如果必须插入另一个,则可以将其置于例如15,而无需更改任何其他值。 注2:这意味着,如果您的客户决定“GOLD”现在应显示为“PREMIUM”,您将更改1个数据项的值,并且您的代码不变。可能会节省你很多时间。。。!
但这可能有些过火——由您来评估。

如果您表现良好,您应该将其标准化为一个单独的表格:

statusvalues
id   displaytext sortorder
1    GOLD        10
2    SILVER      20
3    ACTIVE      30
4    INACTIVE    40
然后将id作为您的状态值存储在主表中。从主表连接到此表,以获取displaytext和sortorder,并进行适当排序

注1:我在排序顺序中留有间隙,因此如果必须插入另一个,则可以将其置于例如15,而无需更改任何其他值。 注2:这意味着,如果您的客户决定“GOLD”现在应显示为“PREMIUM”,您将更改1个数据项的值,并且您的代码不变。可能会节省你很多时间。。。!
但这可能有点过头了——由你来评估。

这可能会帮助某些人。假设您有一个表(MyTable),其中一列(StatusTypeID)作为“StatusTypes”表中的外键。您可以实现这样一个过程来进行动态排序

CREATE PROCEDURE DynamicSort(@SortOrder int)   
AS
BEGIN

SELECT * FROM MyTable
ORDER BY
CASE WHEN StatusTypeID = @SortOrder then 1
END 

DESC

END
--  exec  DynamicSort 7

这可能对某人有所帮助。假设您有一个表(MyTable),其中一列(StatusTypeID)作为“StatusTypes”表中的外键。您可以实现这样一个过程来进行动态排序

CREATE PROCEDURE DynamicSort(@SortOrder int)   
AS
BEGIN

SELECT * FROM MyTable
ORDER BY
CASE WHEN StatusTypeID = @SortOrder then 1
END 

DESC

END
--  exec  DynamicSort 7

+1工作得很好-另一个选项是为可能的状态值创建一个单独的查找表,并在该查找中定义一个顺序table@marc_s:当然。我差点忘了这一点,但我不想“弄脏水”,我喜欢这个快速简单的解决方案。非常感谢:)+1工作得很好-另一个选项是为可能的状态值创建一个单独的查找表,并在该查找中定义顺序table@marc_s:当然。我差点忘了这一点,但我不想“弄脏水”,我喜欢这个快速简单的解决方案。非常感谢:)+1。这是实施灵活排序的更一般的方法。不要将
id
列设为四字节int,将其设为一字节tinyint,或者将其称为
WidgetStatusCode
,并将其设为char(1)。我不会将其设为char;如果将其设置为数字,则可以执行有用的操作,如“if WidgetStatus<3…”或按位操作(如果您非常聪明)。+1。这是实施灵活排序的更一般的方法。不要将
id
列设为四字节int,将其设为一字节tinyint,或者将其称为
WidgetStatusCode
,并将其设为char(1)。我不会将其设为char;如果将其设置为数字,则可以执行有用的操作,如“if WidgetStatus<3…”或按位操作(如果您非常聪明)。