2014-07-19 2 views
1

하나를 모두 가지고있는 데이터를 정렬 할 필요가 같은 값 ..쿼리 숫자와 알파벳 내 테이블

Year 1 
Year 9 
Year 8 
Year 4 
Kindy [can be any word without numbers] 
Pre-School [can be any word without numbers] 
Year 8 
Year 22 
Year 15.... 

을 나는이 같은 오름차순으로 숫자에 의해 다음 순으로 먼저 그들을 정렬 수있는 방법 ..

Kindy 
Pre-School 
Year 1 
Year 4 
Year 8 
Year 9 
Year 15 
Year 22 

내가 시도했던

SELECT YearLevel FROM Student 
ORDER BY 
CASE WHEN YearLevel NOT LIKE '%[0-9]%' THEN 0 
ELSE CAST(RIGHT(YearLevel, LEN(YearLevel) - 5) AS int) 
END 

.. 다음 그러나 문제는 내가 창피 필요 이것이 내가 일을 할 수 있지만 자리 열이 항상 Year [digits] 형식이있는 경우 tinct 만 기록 ..

+0

문제가 정렬 또는 고유 기록에 도착하고 도움이 될 수 있을까? 원하는 고유 레코드에 도착하면 먼저 와야합니다. 당신은'SELECT DISTINCT'를 시도 했습니까'SELECT DISTINCT'는 전체 행에서 작동합니다 –

답변

0

참조,이

SELECT YearLevel FROM student 
GROUP BY YearLevel 
ORDER BY 
    (CASE 
     WHEN YearLevel LIKE 'Year%' 
     THEN 'Year' + CONVERT(varchar,LEN(YearLevel)) + YearLevel 
     ELSE YearLevel 
    END) 

http://sqlfiddle.com/#!3/1919c/3

을 시도 할 수 있습니다 정렬 순서가있는 정수 열을 추가하는 것이 좋습니다.

+0

나는이 답변을 becoz로 표시했습니다. 그것은 별개의 값을 갖습니다 :-) – user2288976

0
select 
     astring 
from table1 
order by 
     case when left(astring,5) = 'Year ' then 2 
      else 1 end 
     , case when left(astring,5) = 'Year ' then right(replace(astring,'Year ','00000000'),3) 
      else astring end 
     , astring 

this sqlfiddle

0

시도하십시오 :

SELECT 
    * 
FROM 
    YourTable 
ORDER BY 
    CONVERT(INT, STUFF(Col, 1, PATINDEX('%[0-9]%', Col)-1, '')), 
    LEFT(Col, PATINDEX('%[0-9]%', Col+'1')-2) 

SQL Fiddle Demo

0

;WITH cte_Student (YearLevel) as 
(SELECT 'Kindy ' UNION ALL 
SELECT 'Year 9' UNION ALL 
SELECT 'Year 4' UNION ALL 
SELECT 'Pre-School' UNION ALL 
SELECT 'Year 1' UNION ALL 
SELECT 'Year 15' UNION ALL 
SELECT 'Year 8' UNION ALL 
SELECT 'Year 22') 
SELECT YearLevel 
FROM cte_Student 
ORDER BY 
     CASE 
     WHEN LEFT(YearLevel, 5) = 'Year ' THEN CAST(SUBSTRING(YearLevel, 5, LEN(YearLevel)) AS INT) 
     ELSE 0 
     END; 
관련 문제