# SQL ORDER BY



## The_S (24. Jul 2007)

Hi,

ich habe eine relativ große Datenbankabfrage. Blöderweiße hat so ein simpel beim Anlegen einer Tabelle (ist schon mehrere Jahre her) ein Datum anstelle von yyyymmdd im Format ddmmyyyy abgespeichert. Was natürlich recht hinterlich ist, vorallem weil ich in meinem SQL zum Einen überprüfen muss, ob das Datum in der DB zwischen zwei anderen Daten liegt und was noch viel komplexer ist, ich muss an 2. Stelle nach dem Jahr und an 3. Stelle nach dem Monat sortieren. Der Tag soll nicht berücksichtigt werden.

Wir haben uns aufjedenfall schon eine kleine "Methode" geschrieben, mit der wir das Datum (andt aus der Tabelle OP) in die richtige Reihenfolge drehen. Dadurch wird die between Abfrage natürlich ziemlich "einfach" machbar:


```
CASE WHEN OP.ANDT > 9999999 THEN SUBSTR( CHAR ( OP.ANDT ) , 5 , 4 ) CONCAT SUBSTR( CHAR ( OP.ANDT ) , 3 , 2 ) 
CONCAT SUBSTR( CHAR ( OP.ANDT ) , 1 , 2 ) WHEN OP.ANDT > 0 AND OP.ANDT < 9999999 THEN SUBSTR( CHAR ( OP.ANDT ) , 4 , 4 ) 
CONCAT SUBSTR( CHAR ( OP.ANDT ) , 2 , 2 ) CONCAT '0' CONCAT SUBSTR( CHAR ( OP.ANDT ) , 1 , 1 ) ELSE '0' END BETWEEN ? AND ?
```

Was mir jetzt probleme macht ist die Sortierung. Der SQL ist wie gesagt etwas größer, d. h. ich bau mir erstmal 3 temporäre Tabellen


```
with sq as ( SELECT ... ),
sq2 as (SELECT sq.*, ...),
sq3 as (SELECT sq2.*, ...)
```

gefolgt von dem eigentlichen SQL


```
SELECT sq3.*, ... ORDER BY
```

Wenn ich im ORDER BY irgendwelche Spalten aus dem 1. Select (sq) angebe, wird auch problemlos nach diesen Kriterien sortiert. Jetzt hab ich mir gedacht, drehste hier halt nochmal das Datum um, sortierst nach nem Teilstring und speicherst das Ganze temporär in der neuen Spalte "date" ab:


```
CASE WHEN sq3.ANDT > 9999999 THEN SUBSTR( CHAR ( sq3.ANDT ) , 5 , 4 ) CONCAT SUBSTR( CHAR ( sq3.ANDT ) , 3 , 2 ) 
CONCAT SUBSTR( CHAR ( sq3.ANDT ) , 1 , 2 ) WHEN sq3.ANDT > 0 AND sq3.ANDT < 9999999 THEN SUBSTR( CHAR ( OP.ANDT ) , 4 , 4 ) 
CONCAT SUBSTR( CHAR ( sq3.ANDT ) , 2 , 2 ) CONCAT '0' CONCAT SUBSTR( CHAR ( sq3.ANDT ) , 1 , 1 ) ELSE '0' END date
```

Wenn ich mir diese Spalte dann bei der Ausgabe des ResultSets ausgeben lasse, bekomme ich auch die richtigen Daten mit der richtigen Validierung. Schreibe ich jetzt aber in mein ORDER BY


```
ORDER BY SUBSTR(date, 0, 4), SUBSTR(date, 4, 6)
```

läuft der SQL zwar ohne Probleme durch, sortiert wird allerdings nichts. Jetzt habe ich mir überlegt, dass es evtl. an der Verwendung von substr liegen könnte. Aber auch wenn ich nur nach date sortieren lasse, wird nichts sortiert.

Ein zweiter Versuch diesen Codeschnippsel einfach in den 1. SQL aufzunehmen (der auch auf das eigentliche Datenfeld zugreift) quittiert mir die DB mit einer Fehlermeldung (date fehlt in der Liste oder im Select, was völliger Schwachsinn ist).

Weiß jemand was ich noch probieren könnte?

Danke!


----------



## The_S (24. Jul 2007)

Hat sich erledigt, auch wenn ich keine Ahnung hab warum, aber wenn ich diesen Select als erstes setze funktioniert das Sortieren ansonsten nicht ???:L


----------

