Abfrage nach alphanumerischem Feld sortieren

alfino

Benutzer
Beiträge
12
Ich habe eine Abfrage und möchte diese sortieren. Auf die Abfrage wird von Chrystal Reports zugegriffen. Alternativ versuche ich dort auch die Sortierung zu schaffen, habe aber die Option 'ursprüngliche Sortierung übernehmen', weshalb ich das gerne direkt in der View machen möchte:


select CONTRACTID, EVENTID, STANDNUMMER1, Nummer
from FASY.dbo.FASY_BOOTH INNER JOIN dbo.Lieferschein ON FASY.dbo.FASY_BOOTH.CONTRACTID = CONVERT (varchar, dbo.Lieferschein.Nummer)
order by STANDNUMMER1

Das Feld STANDNUMMER1 ist leider ein varchar mit Zahlen und Buchstaben. Die aktuelle Sortierung ist folgende:
CONTRACTID | EVENTID | STANDNUMER1 | Nummer
180825 2MUA2019 1 180825
182329 2MUA2019 10 182329
180901 2MUA2019 100 180901
181065 2MUA2019 101 181065
181427 2MUA2019 102 181427
181067 2MUA2019 103 181067
180863 2MUA2019 104 180863
180797 2MUA2019 105 180797
181318 2MUA2019 106 181318
181087 2MUA2019 107 181087
181061 2MUA2019 108 181061
181400 2MUA2019 109 181400
181547 2MUA2019 11 181547
180677 2MUA2019 110 180677

Die Sortierung soll aber in der Reihenfolge 1, 2, 3, 3a, usw. sein.
(Das numerische Feld Nummer benötige ich für die Verknüpfung mit dem Lieferschein im Chrystal Report.)
 
Werbung:
Code:
test=*# select * from alfino ;
 standnummer1
--------------
 1
 10
 100
 101
 11
 110
 2
 3
 3a
(9 rows)

test=*# select * from alfino order by regexp_replace(standnummer1,'[^0-9]','','g')::int ;
 standnummer1
--------------
 1
 2
 3a
 3
 10
 11
 100
 101
 110
(9 rows)

test=*# select * from alfino order by regexp_replace(standnummer1,'[^0-9]','','g')::int, regexp_replace(standnummer1,'[0-9]','','g') ;
 standnummer1
--------------
 1
 2
 3
 3a
 10
 11
 100
 101
 110
(9 rows)

test=*#

Allerdings ist das PostgreSQL. Du mußt halt erst einmal alle Nicht-Ziffern ausschneiden und nach INTEGER casten. Bei Bedarf dann noch mal, aber alle Ziffern raus und danach als zweite Spalte sortieren.

Viel Spaß beim sortieren, ähm, probieren.
 
Vielen Dank.
Ich probiere nun schon einige Zeit rum, bekomme es aber leider nicht hin.

Schön wäre es, wenn jemand die reine MSSQL-Variante hätte ;-)
 
Ist ein blödes Beispiel, deine Spalte für die Sortierung enthält keine Buchstaben, wäre ja irgendwie sinnvoll gewesen. Können die Buchstaben nur hinter oder auch vor oder in der Zahl stehen? Also kommt nach 3a nochmal eine Nummer oder läuft das dann nur bis 3zzz...? Wie hoch geht der numerische Teil?

Ich schlag mal was vor:
Code:
ORDER BY right('000000000' + left(spalte,patindex('%[0-9]%',reverse(spalte))),10),spalte
Das würde eine Nummer bis zu 10 Stellen wie eine Nummer sortieren (ohne dabei in eine Zahl zu konvertieren, könnte ja noch ein Buchstabe drinne sein) und im Anschluss nach allen Zeichen die darauf folgen.
 
@ukulele :
Vielen Dank für die Rückmeldung.
Also die Zahlen sind immer vor dem Buchstaben und es gibt pro Nummer nur einen Buchstaben. Somit könnte es so aussehen:

1
2
.
.
10
11
11A
11B
12
.
.
99
100
100A
101
 
Ist ein blödes Beispiel, deine Spalte für die Sortierung enthält keine Buchstaben, wäre ja irgendwie sinnvoll gewesen. Können die Buchstaben nur hinter oder auch vor oder in der Zahl stehen? Also kommt nach 3a nochmal eine Nummer oder läuft das dann nur bis 3zzz...? Wie hoch geht der numerische Teil?

Ich schlag mal was vor:
Code:
ORDER BY right('000000000' + left(spalte,patindex('%[0-9]%',reverse(spalte))),10),spalte
Das würde eine Nummer bis zu 10 Stellen wie eine Nummer sortieren (ohne dabei in eine Zahl zu konvertieren, könnte ja noch ein Buchstabe drinne sein) und im Anschluss nach allen Zeichen die darauf folgen.

Schaut bei mir jetzt so aus:
a:= right('0000000000' + left({FASY_Standnummern.STANDNUMMER1},patindex(totext'%[0-9]%',reverse({FASY_Standnummern.STANDNUMMER1}))),10) & {FASY_Standnummern.STANDNUMMER1}

Wenn ich die Kontrolle (Alt+c) in Crystal Reports mache, dann bekomme ich 'patindex' markiert mit der Meldung: Hier wird eine Zahl, ein Währungsbetrag, ein boolscher Wert, ein Datum, eine Zeit, ein Datums-/Zeitwert oder eine Zeichenfolge erwartet.
Bin hilflos.
 
Werbung:
Zurück
Oben