2017-01-02 10 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 

どのように私は(日付として)一週間でこのテーブルを並べ替えることができます以下のように私は、2つの列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

週の列のデータタイプを教えてください。 –

+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) 

テーブル構造を変更(一部の列を追加する)ことができるかどう

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 
1

が受け入れ答えにアップBulding戻り値は、それが行うことができ永続化された計算カラムを使用することにより、データをより親しみやすい方法で格納できます。これは、データの挿入にいくらかのストレージと追加の計算労力を必要としますが、文字列の解析はもはや必要ではないため、将来の選択を高速化します。また、各列には適切な型があるため、無効なデータを取得することは困難です。

セットアップ:

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 
関連する問題