2017-01-02 4 views
4

Ich habe Daten in einer Tabelle mit zwei Spalten week und amount wie untensortieren Woche weise Datum im String-Format

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 
gezeigt

Wie kann ich von Woche diese Tabelle sortieren (das Datum)?

Meine gewünschte Ausgabe ist:

 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

Ist-Daten vorhanden gleiche wie oben ?? –

+0

Geben Sie den Datentyp der Spalte "Week" an. –

+0

@Dour High Arch Datentyp ist varchar –

Antwort

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

Returns

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

auf akzeptierte Antwort Bulding auf, wenn Tabellenstruktur Änderungen sein können (fügen Sie einige Spalten), kann es zu erfolgen Speichern Sie Daten auf viel freundlichere Weise, indem Sie persistente berechnete Spalten verwenden. Dies kostet etwas Speicherplatz und zusätzlichen Rechenaufwand bei der Dateneingabe, aber es wird die zukünftige Auswahl schneller machen, da das Parsen von Strings nicht länger erforderlich ist. Außerdem hat jede Spalte den passenden Typ, sodass es schwieriger ist, ungültige Daten zu erhalten.

Setup:

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

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