2017-01-02 1 views
4

나는 일주일에 의해이 테이블을 정렬 할 수있는 방법정렬 주 현명한 날짜는

Week      Amount 
-------------------------------- 
1w - 1m - 2015    1000 
4w - 8m - 2015    1000 
2w - 2m - 2015    1000 
4w - 6m - 2015    1000 
3w - 3m - 2015    1000 
3w - 10m - 2015   1000 
1w - 10m - 2015   1000 
3w - 12m - 2015   1000 
1w - 6m - 2016    1000 
2w - 6m - 2016    1000 
3w - 6m - 2016    1000 
4w - 6m - 2016    1000 
3w - 8m - 2016    1000 
2w - 9m - 2016    1000 

아래 두 개의 열 weekamount있는 테이블의 데이터 보여로 (날짜 등)?

내 원하는 출력은 다음과 같습니다 테이블 구조 변경 (일부 열을 추가) 될 수 있다면

week   Amount 
1w - 1m - 2015 1000 
2w - 2m - 2015 1000 
3w - 3m - 2015 1000 
4w - 6m - 2015 1000 
4w - 8m - 2015 1000 
1w - 10m - 2015 1000 
3w - 10m - 2015 1000 
3w - 12m - 2015 1000 
1w - 6m - 2016 1000 
2w - 6m - 2016 1000 
3w - 6m - 2016 1000 
4w - 6m - 2016 1000 
3w - 8m - 2016 1000 
2w - 9m - 2016 1000 
+0

이 존재하는 데이터가 상기와 같은 것입니까? –

+0

Week 열의 데이터 유형을 알려주십시오. –

+0

@Dour High Arch 데이터 유형은 varchar입니다. –

답변

5
Select * 
From YourTable 
Order by right([Week],4) 
     ,cast(substring([Week],charIndex('m',[Week])-2,2) as int) 
     ,left([Week],1) 

반환, 그것은을 만들 수 있습니다 지속 된 계산 된 열을 사용하여 훨씬 친숙한 방식으로 데이터를 저장합니다. 이것은 약간의 스토리지와 데이터 삽입에 대한 추가 계산 노력을 필요로하지만, 문자열 파싱이 더 이상 필요 없기 때문에 미래의 선택을 더 빠르게 할 것입니다. 또한 각 열에는 적절한 유형이 있으므로 유효하지 않은 데이터를 가져 오는 것이 더 어렵습니다.

설정 :

create table WeekData 
(
    WeekStr VARCHAR(16) NOT NULL, 
    Amount INT, 
    YearVal AS CAST (Right(WeekStr,4) AS SMALLINT) PERSISTED, 
    MonthVal AS cast(substring(WeekStr,charIndex('m', WeekStr)-2,2) as SMALLINT), 
    WeekVal AS CAST(left(WeekStr,1) AS TINYINT) 
) 

insert into WeekData (WeekStr, Amount) 
VALUES ('1w - 1m - 2015', 1000), 
('4w - 8m - 2015', 1000), 
('2w - 2m - 2015', 1000), 
('4w - 6m - 2015', 1000), 
('3w - 3m - 2015', 1000), 
('3w - 10m - 2015', 1000), 
('1w - 10m - 2015', 1000), 
('3w - 12m - 2015', 1000), 
('1w - 6m - 2016', 1000), 
('2w - 6m - 2016', 1000), 
('3w - 6m - 2016', 1000), 
('4w - 6m - 2016', 1000), 
('3w - 8m - 2016', 1000), 
('2w - 9m - 2016', 1000) 
GO 

선택

select WeekStr, Amount 
from WeekData 
order by YearVal, MonthVal, WeekVal 
1

이 허용 대답에 최대 빌딩

 Week     Amount 
    -------------------------------- 
    1w - 1m - 2015    1000 
    2w - 2m - 2015    1000 
    3w - 3m - 2015    1000 
    4w - 6m - 2015    1000 
    4w - 8m - 2015    1000 
    1w - 10m - 2015   1000 
    3w - 10m - 2015   1000 
    3w - 12m - 2015   1000 
    1w - 6m - 2016    1000 
    2w - 6m - 2016    1000 
    3w - 6m - 2016    1000 
    4w - 6m - 2016    1000 
    3w - 8m - 2016    1000 
    2w - 9m - 2016    1000