2011-07-31 5 views
1

GOLD, SILVER, ACTIVE 또는 INACTIVE 일 수있는 테이블이 있습니다.다른 값으로 SQL Server 주문

나는 그 순서대로 정렬하고 최상위 X를 취하고 싶습니다. 어떻게 내 쿼리에 그 것을 쓸 수 있습니까?

현재 나는 그 SILVER를 쿼리 다시 크기를 확인, 목록의 크기를 확인 후 GOLD 먼저 조회하여 목록을 작성하고 있어요 등

답변

13
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 
+1

한 위대한 작품 - 다른 옵션이 가능한 상태 값에 대한 별도의 조회 테이블을 가지고 있고, 그 룩업 테이블에 –

+0

@marc_s 주문의 순서를 정의하는 것입니다 : 절대적으로. 나는 그 사실을 거의 잊지 않았지만 '물을 진흙 투성이'하고 싶지는 않았다. –

+0

나는이 빠르고 쉬운 해결책을 좋아한다. 고마워요. :) – Jesper

5

당신이 좋은으로 된 경우,

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

다음으로 주 테이블에 상태 값으로 id를 저장하십시오. 메인 테이블에서이 테이블에 가입하여 displaytext와 sortorder를 얻고 적절히 정렬하십시오.

NB 1 정렬 순서에 간격이 있으므로 다른 항목을 삽입해야하는 경우 정렬 기준에 맞출 수 있습니다. 15 다른 값을 변경할 필요없이. NB 2 이는 고객이 "GOLD"가 "프리미엄"으로 표시되어야한다고 결정하면 데이터 항목 값 1을 변경하고 코드는 변경되지 않음을 의미합니다. 많은 시간을 절약 할 수 있습니다 ...! 하지만 과장 될 수 있습니다. 평가할 수는 있습니다.

+0

+1을 저장했습니다. 유연한 순서를 지정하는 가장 일반적인 방법입니다. –

+0

'id' 컬럼을 4 바이트 정수로 만들지 말고 1 바이트 tinyint로 만들거나 그냥'WidgetStatusCode'라고 부르면 char (1)이됩니다. –

+0

나는 그것을 char로 만들지 않을 것이다. 숫자로 만들면 "if WidgetStatus <3 ..."또는 비트 연산과 같은 유용한 작업을 수행 할 수 있습니다. –

-1

누군가에게 도움이 될 수 있습니다. 'StatusTypes'테이블의 외래 키로 열 (StatusTypeID)이있는 테이블 (MyTable)이 있다고 가정 해보십시오. 이와 같이 동적 정렬을 수행하는 프로 시저를 구현할 수 있습니다.

CREATE PROCEDURE DynamicSort(@SortOrder int) 
AS 
BEGIN 

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

DESC 

END 
-- exec DynamicSort 7 
관련 문제