2016-06-06 5 views
1

ich eine Tabelle mit Renditen wie 12X90 haben, 12x120, 12X160 usw.Kann nicht eine korrekte Art mit SQL Server 2008 erhalten

Die Zahlen nach dem „X“ sind Gewichte. Ich muss die Gewichte nur mit führenden Nullen auffüllen, so dass 90 zu 090 wird. Bei einer normalen Sortierung wird die letzte 90 anstelle der ersten gesetzt, die Liste muss nach Gewicht sortiert sein.

Wie kann ich das erreichen?

+0

eine 'sortorder' Spalte hinzufügen? –

+0

Jede normale Sortierung würde 90 nicht als Erstes angeben, weil Sie eine String-Sortierung durchführen. Sie müssen entweder nur einen Teil der Zeichenkette sortieren, in eine Zahl umgewandelt werden - oder eine bessere Methode wäre die Einführung eines Sortierschlüssels, den Sie berechnen und nach –

Antwort

2

Verwenden Sie charindex, um die Nummer nach X in der Spalte und Reihenfolge nach dieser Nummer zu erhalten.

select * from tablename 
order by cast(case when charindex('X',col) > 0 then substring(col,charindex('X',col)+1,len(col)) 
     else col end as numeric) 

Wenn die Zeichenfolge vor X auch für die Sortierung in Betracht gezogen werden sollte, verwenden

select * from tablename 
order by 
cast(case when charindex('X',col) > 0 then substring(col,1,charindex('X',col)-1) 
else col end as numeric) 
,cast(case when charindex('X',col) > 0 then substring(col,charindex('X',col)+1,len(col)) 
else col end as numeric) 

Sample demo

+0

sortieren können. Dies ergibt immer noch die gleichen Renditen wie bei (Beispiel) 65 nach 336 – Obfuscated

+0

Das "X" wird nicht verwendet, es wird bei jeder Rückkehr sein. – Obfuscated

+0

hast du die neueste Version überprüft? Ich habe den Teilstring als numerisch eingegeben. es sollte funktionieren. –

0

einen Quer verwenden anwenden

select 
b.* from table t1 
cross apply 
(select replace(t.weight,'12x','') as replaced from table t2 where t2.weight=t1.weight) b 
order by b.replaced 
+0

Immer noch die gleichen Ergebnisse. – Obfuscated