PDA

Ver la Versión Completa : Ordenar por los 3 ultimos numeros


Roilo
05-04-2006, 22:13:20
Un Abraso al Foro.
FELICIDADES por el nuevo ambiente.
Ok.
Tengo una tabla DBF, en ella hay un campo que guarda un codigo para cada registro. Quisiera obtener una consulta ordenada teniendo en cuenta los tres ultimos números de ese codigo ejemplo:
5101
8101
9101
102
5102
103
5103
8103
si comprendieron la idea les agradeceria que me dijeran como lo puedo lograr.
Gracias de antemano.

alapaco
05-04-2006, 22:20:30
Te paso un ejemplo:

SELECT COL1,
SUBSTR (COL1, LENGTH (COL1) - 2) COLUMNA_ORDENADA
FROM TABLA1
ORDER BY 2

Eso anda en Oracle...aunque no se si se puede hacer con archivos DBF..

marcoszorrilla
05-04-2006, 22:27:23
Mira este ejemplo:

Select Substring(Codigo from 5 for 7), nombre, Nif
from Clientes
order by 1 desc


Un Saludo.

roman
05-04-2006, 22:32:22
El problema que veo es que a juzgar por la muestra que pone Roilo, no todos los valores tienen la misma longitud.

// Saludo

alapaco
05-04-2006, 22:33:37
El problema que veo es que a juzgar por la muestra que pone Roilo, no todos los valores tienen la misma longitud.

// Saludo

Pero en el ejemplo que postee yo, tomo los últimos 3, cual sería el problema ??

marcoszorrilla
05-04-2006, 22:40:14
Pues que From indica desde que número empezamos y si los números no son del mismo ancho no funcionará, voy a hacer otras pruebas a ver si logro algo.

Un Saludo.

roman
05-04-2006, 22:43:35
Pero en el ejemplo que postee yo, tomo los últimos 3, cual sería el problema ??

¡Ah! Disculpa, iba a comentar al respecto y lo olvidé. Tu solución no tiene ningún problema, es DBase quien lo tiene :D Que yo recuerde no cuenta con la función LENGTH.

// Saludos

JOSEA
06-04-2006, 17:29:17
Tomando como partida el de marcoszorrilla

Select numero,substring(cast((numero+1000000000) as char(10)) from 8 for 3)
from clientes
order by 2

roman
06-04-2006, 18:26:26
MAESTRO JOSEA, en estos momentos me quito el sombrero y me pongo de pie. Pensé que esto iba a ser imposible con dbase o paradox pero ya veo que no. El único pero que podría tener esto es que hay que conocer la longitud máxima que pudieran tener los códigos, pero normalmente esto se sabe. Tu solución no sólo da un método para extrare caracteres de derecha a izquierda sino también sirve para una función tipo PAD también muy requerida. Sólo hay que notar, en esta solución, que si el campo original es de tipo CHAR hay que hacer antes otro CAST a INT.

¡Buenísimo truco!

// Saludos

marcoszorrilla
06-04-2006, 19:44:47
Es curioso pero estuve implementando algo parecido, ya que lo que tenía claro es que el funcionamiento dependia de la longitud homegenea de los números, utilice Cast y Substring pero finalmente no me salio y como era tarde lo dejé, pero me alegro de que alguien lo haya llevado a buen término.

Un Saludo.

Roilo
10-04-2006, 13:59:16
Una vez más me impresionan.
Todo ha quedado resuelto con la solución de Josea (FELICIDADES) a ti y al resto del colectivo.
Un abraso.

FOURIER
12-04-2006, 13:17:50
se me ocurre

select * from Tabla order by int(right(campoordenar,3));

roman
12-04-2006, 16:55:25
FOURIER: lo que sucede es que el sql para manejar dbase no cuenta con la función right; de hecho casi no cuenta con ninguna función para cadenas como no sea substring. Por ello es que hay que recurrir a métodos tan rebuscados como los ya descritos.

// Saludos

Roilo
04-09-2006, 20:45:49
Hola, después de casi 4 meses de terminar este hilo, lo retomo porque me ha surgido una nueva. Resulta que ahora estoy conectado a un servidor local MySQL, y este tan discutido código ahora no me corre. Me da un herror en el código de JOSEA :


Select numero,substring(cast((numero+1000000000) as char(10)) from 8 for 3) from clientes
order by 2;




:confused: el error de sintaxis me da serca de : (10)) from 8 for ...
Tengo más o menos entendido que las sintaxis SQL no son las mismas para los diferentes motores de BD,me gustaría que me orientaran al respecto, porque tambien pienso excursionar en MS SQL Server.
GRACIAS de antemano.

marcoszorrilla
04-09-2006, 23:04:07
Select Iva, SubString(Cast(iva + 1000000000 as Char(10)) from 8 for 3)
From Factura
Order by 2

Esto me funciona perfectamente.

Un Saludo.