SQL - Ordenar campo alfanumérico

 
Vista:

Ordenar campo alfanumérico

Publicado por Ramon (6 intervenciones) el 03/09/2012 14:17:03
Hola.
Quisiera ordenar un campo alfanúmero que tiene la siguiente secuencia de datos:

1, 2CV, 4, 6CV, 7, 8, 10CV...

(Cuando tienen letras siempre es "CV")

Quiero que en la consulta SQL aparezca el siguiente orden:

1, 4, 7, 8, 2CV, 6CV, 10CV...

Es decir, primero los números y luego los números que tienen la "CV"

¿Alguien puede ayudarme?

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ordenar campo alfanumérico

Publicado por zendi (1 intervención) el 03/09/2012 14:31:34
utiliza este ejemplo con tus campos por supuesto, a ver, y me comentas,
utiliza tambien con ASC en lugar de DESC.

SELECT store_name, Sales, Date
FROM Store_Information
ORDER BY 2 DESC
saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar campo alfanumérico

Publicado por Ramón (6 intervenciones) el 03/09/2012 18:57:05
Gracias, Zendi por tu interés.

He probado con tu sentencia y me sale lo siguiente:

1001
1000
101
101CV
1021
1022
102CV
103CV
....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ordenar campo alfanumérico

Publicado por leonardo_josue (1173 intervenciones) el 03/09/2012 20:18:14
Hola Ramón...

En tu post no nos dices con qué BD estás trabajando, por lo tanto no es posible darte una respuesta puntual. Tienes que recordar que aunque la sintaxis entre los DBMS es parecida, NO ES LA MISMA, también las funciones que poseen cada uno de ellos pueden facilitar o complicar lo que estás tratando de hacer... por lo pronto te dejo la lógica de cómo sería con MySQL. Si no utilizas esta BD sería cuestión de que trates de encontrar un equivalente...

Para el ejercicio en realidad se me ocurren dos maneras muy parecidas para ordenar los datos, la primera sería simplemente determinando si el campo contiene solo números o contiene alguna letra... de esta manera, puedes indicarle al motor de BD que ordene primero aquellos que contengan sólo números y después el resto... Dependiendo de la BD que estés utilizando, puede tener alguna función que te ayude a hacer esto, por eso comenté al principio que es muy importante que nos digas con qué estás trabajando.

Otra manera en que puedes resolver el problema es simplemente determinando si el campo contiene la palabra 'CV', y de esa manera volver a jerarquizar la ordenación... En MySQL sería así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> SELECT campo, campo REGEXP '^[0-9]+$', INSTR(campo, 'CV')
    -> FROM tabla;
+-------+-------------------------+--------------------+
| campo | campo REGEXP '^[0-9]+$' | INSTR(campo, 'CV') |
+-------+-------------------------+--------------------+
| 1     |                       1 |                  0 |
| 2CV   |                       0 |                  2 |
| 4     |                       1 |                  0 |
| 6CV   |                       0 |                  2 |
| 7     |                       1 |                  0 |
| 8     |                       1 |                  0 |
| 10CV  |                       0 |                  3 |
+-------+-------------------------+--------------------+
7 rows in set (0.00 sec)


Observa que al utilizar REGEXP (expresión regular) puedes determinar si el campo contiene sólo números o no... por su parte con la función INSTR puedes determinar si el campo contiene la cadena CV o no... de tal manera, que con esta información, tu podrías hacer el ORDER BY así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> SELECT campo
    -> FROM tabla
    -> ORDER BY campo REGEXP '^[0-9]+$' DESC, campo;
+-------+
| campo |
+-------+
| 1     |
| 4     |
| 7     |
| 8     |
| 10CV  |
| 2CV   |
| 6CV   |
+-------+
7 rows in set (0.00 sec)
 
mysql> SELECT campo
    -> FROM tabla
    -> ORDER BY IF(INSTR(campo, 'CV') = 0, 0, 1), campo;
+-------+
| campo |
+-------+
| 1     |
| 4     |
| 7     |
| 8     |
| 10CV  |
| 2CV   |
| 6CV   |
+-------+
7 rows in set (0.00 sec)


Observa que en el ORDER BY utilizo REGEXP o INSTR como primer criterio de ordenación, y después coloco el campo como tal... Te repito, esta sería una manera de hacerlo con MySQL, trata de obtener el equivalente para la BD que estés utilizando.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar campo alfanumérico

Publicado por Ramón (6 intervenciones) el 03/09/2012 21:13:28
Leo, tienes razón, perdona, no había puesto con qué motor de base de datos estoy trabajando. Es con Access.

Efectivamente, quiero que salgan los datos con las siguiente secuencia:

1
4
7
8
2CV
6CV
10CV

He intentado lo que me has indicado y resulta:

SELECT NUMERO FROM EMPRESA ORDER BY IF(INSTR(NUMERO, 'CV') = 0, 0, 1), NUMERO;
(Me dice que la función If no está definida)

SELECT NUMERO FROM EMPRESA ORDER BY NUMERO REGEXP '^[0-9]+$' DESC, NUMERO;
(Aquí me dice que falta un operador en la expresión 'NUMERO REGEXP '^[0-9]+$''. He copiado la expresión tal cual me lo dice, incluyendo la comilla inicial y la doble comilla fina de la expresiónl)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar campo alfanumérico

Publicado por Ramón (6 intervenciones) el 03/09/2012 23:45:22
He conseguido (Gracias a Leo) ordenar el campo, pero en consultas diferentes:

Con esta instrucción ordeno los números que tienen las letras 'CV"

SELECT NUMERO.
FROM EMPRESA (((NUMERO) Like "*CV"))
ORDER BY Right(String(7,'0') & NUMERO,'7');

Y con esta los que no oa tienen:

SELECT NUMERO
FROM EMPRESA
WHERE (((NUMERO) Not Like "*CV"))
ORDER BY Right(String(7,'0') & NUMERO,'7');

Ahora la cuestión es unir las consultas sin que se altere el resultado. ¿Como hacerlo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ordenar campo alfanumérico

Publicado por leonardo_josue (1173 intervenciones) el 03/09/2012 23:45:27
Hola otra vez Ramón:

En mi post te comentaba que si ni no utilizabas MySQL DEBÍAS BUSCAR EL EQUIVALENTE, no creo que resultara muy complicado preguntar en SAN GOOGLE sobre una función para verificar si un campo tiene solo números... en fin, aunque no suelo dar simplemente la respuesta, haré una excepción: prueba así:

1
2
3
4
5
6
7
8
9
SELECT campo
FROM Tabla
order by
ISNUMERIC(campo), campo
 
SELECT campo
FROM Tabla1
ORDER BY
IIF(INSTR(campo, 'CV') = 0, 0, 1), campo


Y para la próxima compañero, no esperes una respuesta solo para copiar y pegar... hay que investigar un poco por tu cuenta no crees...

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar campo alfanumérico SOLUCIONADO

Publicado por Ramón (6 intervenciones) el 04/09/2012 09:06:58
Ya lo he solucionado de otra manera.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ordenar campo alfanumérico SOLUCIONADO

Publicado por xve (284 intervenciones) el 04/09/2012 09:55:25
Hola Ramón, nos puedes comentar como lo has solucionado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar campo alfanumérico SOLUCIONADO

Publicado por Ramón (6 intervenciones) el 04/09/2012 10:45:12
Claro que sí, xve.

Como comentaba, el campo es alfanumérico, de ancho 7 y en el que se incluyen una serie numérica y otra serie con números y seguidos de las letras "CV". Por ejemplo, la sigueinte serie:

1, 2, 5CV,10, 25, 35CV...

Y lo que pretendía era que saliera ordenado así:

1, 2, 10, 25. 5CV, 35CV...

Lo que he hecho es realizar dos consultas, una para los que son exclusivamente números y otra para los que tienen las letras "CV". Conseguidas ambas consultas, las he unido con UNION ALL.

La sentencia sería la siguiente:

(SELECT NUMERO
FROM EMPRESA
WHERE (((NUMERO) Like "*CV"))
ORDER BY Right(String(7,'0') & NUMERO,'7'))<---- con esto saco las "CV" ordenadas
UNION ALL (SELECT NUMERO
FROM EMPRESA
WHERE (((NUMERO) Not Like "*CV"))ORDER BY Right(String(7,'0') & NUMERO,'7'));<---- Con esto saco los que son únicamente número y ordenados

Así se muestran: 1CV. 2CV, 3CV, 4CV....1,2,3,4,5
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ordenar campo alfanumérico SOLUCIONADO

Publicado por leonardo_josue (1173 intervenciones) el 04/09/2012 16:23:34
Hola Ramón...

Probaste alguna de las dos soluciones que te puse??? creo que son mucho más sencillas que lo que estás tratando de hacer y a fin de cuentas obtienes el mismo resultado (bueno, en realidad obtienes los resultados en orden inverso, pues en el primer post decías que querias obtener (1, 4, 7, 8, 2CV, 6CV, 10CV), pero ahora resulta que dices que necesitas obtener (1CV. 2CV, 3CV, 4CV....1,2,3,4,5)... lo que estás tratando de hacer, si bien puede funcionar es muy ineficiente, de entrada las comparacioens tipo LIKE son de las más lentas que existen en SQL, además en realidad estás haciendo dos subconsultas, cuando creo que podrías hacerla con una sola...

Si lo que te puse sirve, DINOS EN DONDE ESTÁ EL ERROR, para tratar de hacer algún tipo de ajuste. y simplificar la consulta que tienes.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar