Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-05-2004
Franklim Franklim is offline
Miembro
 
Registrado: abr 2004
Posts: 31
Poder: 0
Franklim Va por buen camino
Consulta por orden de parte Expediente

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
Responder Con Cita
  #2  
Antiguo 18-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
no lo he probado, pero pueba a investigar por aquí:

Código SQL [-]

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
Responder Con Cita
  #3  
Antiguo 18-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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)
Código SQL [-]
Select expediente expediente_text, cast(expediente as Integer)
  from tabla
 order by 2;

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

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 19-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por jachguate
Código SQL [-]
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
Responder Con Cita
  #5  
Antiguo 19-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 19-05-2004
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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

Código:
select * from tabla order by NumeroExpediente Desc
Lo que no recuerdo es si desc va alli o antes
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #7  
Antiguo 19-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por jachguate
... 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 )

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

Bueno, veré vuestras contestaciones mañana, que ahora ya me largo a la cama que estoy diciendo muchas tonterías
Responder Con Cita
  #8  
Antiguo 19-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Cita:
Empezado por cadetill
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 )
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 19-05-2004
sanxpue sanxpue is offline
Miembro
 
Registrado: jul 2003
Posts: 196
Poder: 21
sanxpue Va por buen camino
Talking Creo que..

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...

O de plano que la haga manual.. sobres eso si va a estar mas cañon.. pero que se puede se puede..
__________________
saludos desde Puebla Mexico..
asanxt@hotmail.com
"como siempre a sus ordenes y siempre con buena cara"
'lolita me excitas, perversa piel de melocotón'
Responder Con Cita
  #10  
Antiguo 19-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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)
Código SQL [-]
create table prueba (
  alfa varchar(7),
  integ integer
)
Bien, con esto introduzco los siguientes valores
Código:
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):
Código SQL [-]
Select cast(alfa as integer)
from tabla
order by 1;
obtengo el siguiente resultado
Cita:
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)
Código SQL [-]
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
Cita:
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
Responder Con Cita
  #11  
Antiguo 19-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 19-05-2004
Franklim Franklim is offline
Miembro
 
Registrado: abr 2004
Posts: 31
Poder: 0
Franklim Va por buen camino
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

Código SQL [-]
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.
Responder Con Cita
  #13  
Antiguo 19-05-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por Franklim
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 ).

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)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:26:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi