PDA

Ver la Versión Completa : Consulta por orden de parte Expediente


Franklim
18-05-2004, 12:35:12
Hola amigos, tengo el siguiente problema, a ver si me pueden ayudar por favor :

Necesito hacer una consulta sql que me devuelva los registros ordenados por un campo, en este caso el Numero de Expediente, esto que digo parece sencillo pero el problema es como yo genero los numeros de expediente :


Año incremento Numero Expediente
2004 1 20041
2004 2 20042
2003 1 20031
2002 1 20021
2002 2 20022
2002 3 20023
...............................................................
2002 10 200210

una consulta ordenada por Numero expediente devolveria lo siguiente :

200210
20042
20041
20031
20023
20022
20021

y yo lo que quiero es que me devuelva primero los del 2004, despues los del 2003 y despues los del 2002.

Aclaro que lo que tengo como numero de expediente es el año y al final le pego otro numero y voy incrementando, no tengo el año por separado.


Saludos y muchas gracias

__cadetill
18-05-2004, 13:27:46
no lo he probado, pero pueba a investigar por aquí:



select substring(cast(Num_Exp as varchar(7)) from 1 for 4) as Ano,
substring(cast(Num_Exp as varchar(7)) from 5 for 7) as Increm
from tabla
order by 1, 2


Espero te sirva

jachguate
18-05-2004, 23:08:56
supongo que el campo lo guardas como texto... siempre y cuando tengas almacenados solo numeros alli, valdria algo como:

(aclaro que he usado el dialecto interbase, dado que no aclaras que motor usas)

Select expediente expediente_text, cast(expediente as Integer)
from tabla
order by 2;


Eso si... no es muy óptimo que digamos...

Hasta luego.

;)

__cadetill
19-05-2004, 00:36:32
Select expediente expediente_text, cast(expediente as Integer)
from tabla
order by 2;


un casteo a un valor numérico no le valdría. Es lo primeo que pensé, pero si te fijas, no pone 0 a la izquierda en el número de expediente por lo que una ordenación así quedaría....

20021
20022
20041
20042
200210

y no interesa eso, ya que 200210 ha de estar antes de 20041. De ahí la propuesta que le dí ;), es decir, extraer el año y ordenarlo y estraer el expediente y ordenarlo como segundo campo

jachguate
19-05-2004, 00:53:08
Yo creo que ambos entendimos algo diametralmente distinto.

Según mi apreciación, lo que Franklim quiere evitar es precisamente la ordenación textual para conseguir una numérica, pues el expediente 20042 es "inferior" al expediente 200410.

Si te das cuenta, hacer una ordenación por el campo de texto que ya tiene concatenado el año y el número de expediente, simplemente, sin "extraer" sus partes lo ordenaría igual que al dividirlo, con lo que no tiene sentido hacerlo; al menos para efectos de la ordenación.

No te parece?

Hasta luego.

;)

eduarcol
19-05-2004, 00:55:54
No se si no entendi el problema o es que no entiendo la respuesta de los amigos cadetill y jachguate, yo al menos haria algo asi


select * from tabla order by NumeroExpediente Desc


Lo que no recuerdo es si desc va alli o antes :(

__cadetill
19-05-2004, 01:04:04
... pues el expediente 20042 es "inferior" al expediente 200410.

pues sí, 20042 es "inferior" a 200410, pero también lo es a 200210 o a 200310 o a 200010 o a....... o sea, es inferior a cualquier número superior a él (jejeje, que tontería acabo de decir :D :D :D)

Pero bueno, a lo que iva, que si hay que ordenar por año, todo numero que empiece por 2002 (por ejemplo) ha de ir delante de cualquier número que empiece por 2004

No se si me he explicado :o

Bueno, veré vuestras contestaciones mañana, que ahora ya me largo a la cama que estoy diciendo muchas tonterías :D :D

jachguate
19-05-2004, 01:38:57
pues sí, 20042 es "inferior" a 200410, pero también lo es a 200210 o a 200310 o a 200010 o a....... o sea, es inferior a cualquier número superior a él (jejeje, que tontería acabo de decir :D :D :D)


Pues si... viendolos como números lo que has dicho es cierto... pero si los ves como cadenas, la cosa cambia, pues "20042" es "superior" a "200410", no??

De alli que si lo que Franklim quiere es el orden numérico de estos, pues mi solución original es válida.

Hasta luego.

;)

sanxpue
19-05-2004, 02:37:02
Creo que aqui va a estar dura la cosa y es que esta mal diseñada la base de datos, la cual deberia estar :

Año Expediente y para que saliera junto debio de hacerlo con un campo computado, pero ahora la cosa es que ya lo hizo asi...y la solucion va a estar criminal....seria mejor que cambie su base de datos no lo creen asi compañeros... :confused:

O de plano que la haga manual.. sobres eso si va a estar mas cañon.. pero que se puede se puede..

__cadetill
19-05-2004, 10:17:38
Lo siento, Juan Antonio, o no entiendo lo que quieres decir, o tu solución no funciona :(

A ver, acabo de hacer la siguiente prueba (motor BDE, tabla PDOX)

create table prueba (
alfa varchar(7),
integ integer
)

Bien, con esto introduzco los siguientes valores

alfa integer
'20021' 20021
'20022' 20022
'20023' 20023
'20041' 20041
'20042' 20042
'200210' 200210
'20031' 20031
'200310' 200310

Bien, si lanzo el sql que propones (tanto para el campo alfa como para en integer):

Select cast(alfa as integer)
from tabla
order by 1;

obtengo el siguiente resultado

alfa
'20021'
'20022'
'20023'
'20031'
'20041'
'20042'
'200210'
'200310'

Con lo que, como puedes ver, no conseguimos la ordenación (creo) deseada ya que el valor '200210' está por detrás del valor '20041', cuando debería de estar por delante.

En cambio, si hago mi propuesta (a la que le faltaba un último casteo a integer)

select cast(substring(cast(alfa as varchar(7)) from 1 for 4) as integer) as Ano,
cast(substring(cast(alfa as varchar(7)) from 5 for 7) as integer) as Increm
from prova
order by 1, 2

Obtenemos la ordenación (creo) esperada

alfa
'20021'
'20022'
'20023'
'200210'
'20031'
'200310'
'20041'
'20042'

Por otro lado, estoy con el amigo sanxpue, esto se podría haber evitado con un diseño diferente de la tabla separando los campos, ya que unirlos comporta menos dolores de cabeza que separarlos ;)

Bueno, espero que este rollo sirva para algo :D

jachguate
19-05-2004, 19:19:46
:o :o :o ups... lo siento, no me habia percatado del asunto, amigo cadetill... pero te asiste toda la razón; sobre todo después de hacer el "cast" de la segunda expresión a entero...

Hasta luego.

;)

Franklim
19-05-2004, 20:45:56
Primero que nada gracias a todos por la ayuda prestada, decir que esta opcion no me la ejecuta Access, pero la idea es la correcta


select cast(substring(cast(alfaas varchar(7)) from 1for 4)as integer) as Ano,
cast(substring(cast(alfaas varchar(7)) from 5for 7)as integer) as Increm
from prova
order by 1, 2


Me dice que falta operador en la primera linea.

Y decir que lo he medio solucionado un poco chapuza pero no se otra manera, he ordenado por fecha y he puesto un indice por el campo fecha ya que para generar el Numero Expediente cojo el año de la fecha asi por lo menos estan agrupados por año aunque no lo esten por Numero expediente.

__cadetill
19-05-2004, 21:11:26
Me dice que falta operador en la primera linea.

Qué error da?

Por otra parte, no se si Access admite el SUBSTRING, quizás sea SUBSTR, no se.

A parte, lo que yo puse fué un ejemplo, tu has de adaptarlo a tu tabla y a tus campos (lo digo porque veo que es la misma consulta que yo te propuese :D).

También decirte que en la consulta que has puesto, falta un espacio en alfaas (a de ser alfa as) y en 1for (ha de ser 1 for y 5 for)