Порядок SQL Server по разным значениям - PullRequest
1 голос
/ 31 июля 2011

У меня есть таблица, где status может быть либо GOLD, SILVER, ACTIVE или INACTIVE.

Я бы хотел отсортировать по этому ... в таком порядке иВозьмите вершину X. Как я могу написать это в своем запросе?

В настоящее время я заполняю список, сначала запрашивая GOLD, а затем проверяя размер списка, затем запрашивая SILVER и сновапроверка размера и т. д.

Ответы [ 3 ]

13 голосов
/ 31 июля 2011
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
5 голосов
/ 31 июля 2011

Если вы хорошо себя чувствуете, вам действительно следует нормализовать это в отдельной таблице:

statusvalues
id   displaytext sortorder
1    GOLD        10
2    SILVER      20
3    ACTIVE      30
4    INACTIVE    40

, а затем сохранить идентификатор в качестве значения вашего состояния на главной таблице.Присоединитесь к этой таблице, чтобы получить отображаемый текст и порядок сортировки, и сортируйте их соответствующим образом.

NB 1 Я оставляю пропуски в порядке сортировки, так что, если вам нужно вставить другое, вы можете установить его, например, в 15 без необходимости изменения каких-либо других значений.NB 2 Это означает, что, если ваш клиент решит, что «GOLD» теперь должен отображаться как «PREMIUM», вы измените 1 значение элемента данных, и ваш код не изменится.Может сэкономить много времени ...!Но это может быть излишним - решать вам.

0 голосов
/ 11 августа 2012

Это может кому-то помочь.Допустим, у вас есть таблица (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
...