Ver Mensaje Individual
  #18 (permalink)  
Antiguo 24/12/2009, 10:05
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ordenar Consulta

algo de explicación:
ordeno por 3 partes,
1) por la primera letra, que siempre es una:
ORDER BY LEFT(CodigoInterno,1),
esto usa como primer criterio para ordenar la S, A, H, P que tienes

2) por el resto de la primera parte antes del guión, lo haya o no, pero quitando la primera letra y haciendo un casting a número (al substring_index le hacemos un substring que carga el número de caracteres total de ese substring_index menos 1, y lo pongo en negativo para que separe esa número de caracteres comenzando desde el final. Es decir, separo de la primera parte hasta el guión (si lo hay) o toda esa primera parte si no lo hay, toda la cadena menos el primer carácter (recuerda que se trata de S,A,H,P), y eso lo hago mediante un SUBSTRING(cadena,- (longitud de la cadena -1)), y mediante un cast a numérico ya puedo ordenar como número esa parte.
CAST(SUBSTRING(SUBSTRING_INDEX(CodigoInterno,'-',1), - (LENGTH(SUBSTRING_INDEX(CodigoInterno,'-',1))-1)) AS UNSIGNED),

3) si hay guión (lo compruebo con INSTR, buscando la posición del guión (si la hay, su posición en la cadena será un número mayor que 0), hago un cast a número de substring_index, con negativo, es decir, empezando desde el final; pero si no hay guión, y aquí radicaba parte del problema, la posición no será mayor que 0 y, en ese caso, ordenará por 0: eso lo hago con el IF
IF(INSTR(CodigoInterno,'-') > 0, CAST(SUBSTRING_INDEX(CodigoInterno, '-',-1) AS UNSIGNED),0)
Naturalmente, también le hago un cast a numérico.

Ya tengo las tres partes y ordeno de forma consecutiva: primero por la primera, segundo por la segunda y tercero por la tercera. Eso es todo.

Última edición por jurena; 25/12/2009 a las 03:36