Ordenar valores numéricos y alfanuméricos en una única consulta

29/06/2004 - 14:38 por Lara | Informe spam
Hola grupo!

Tengo un problema al ordenar los valores de un campo de tipo varchar, que
contiene tanto valores núméricos como alfanuméricos.
Quiero devolver en una única consulta, primero los valores numéricos
ordenados de menor a mayor y a continuación los valores alfanuméricos
ordenados alfabéticamente. Como no he sido capaz de hacerlo en una única
Select, se me ha ocurrido crear una tabla temporal donde inserte primero los
valores numéricos ordenados, y después los valores alfanuméicos ordenados,
por último, devolvería la Select de dicha tabla temporal.

He realizado un script abajo, con una serie de explicaciones para que
entiendan mi problema.
Muchas Gracias!
Lara



El script es todo esto:

Drop table TablaX
Drop table TablaY
CREATE TABLE TablaX (IdTablaX int IDENTITY (1,1) NOT NULL ,
Nombre varchar(50))
INSERT INTO TablaX (Nombre) values ('1')
INSERT INTO TablaX (Nombre) values ('2')
INSERT INTO TablaX (Nombre) values ('3')
INSERT INTO TablaX (Nombre) values ('4')
INSERT INTO TablaX (Nombre) values ('AF')
INSERT INTO TablaX (Nombre) values ('AC')
INSERT INTO TablaX (Nombre) values ('AG')
INSERT INTO TablaX (Nombre) values ('10.1')
INSERT INTO TablaX (Nombre) values ('10.2')

CREATE TABLE TablaY (IdTablaY int IDENTITY (1,1) NOT NULL , Nombre
varchar(50))
/*Ahora quiero insertar en la TablaY los valores del campo Nombre de la
TablaX pero en el siguiente orden:
Primero quiero que aparezcan los valores numéricos (1,2,3,4,10.1,10.2)
ordenados de menor a mayor, y a continuación
los valores alfanuméricos también ordenados (AC,AF,AG)
Lo que yo he hecho es realizar dos consultas diferentes, una para ordenar
los valores numéricos y otra consulta
para ordenar los valores alfanuméricos. No puedo unir ambas consultas,
porque en un caso en el campo Nombre voy a devolver
un número, y en el otro caso voy a devolver un texto

La consulta para ordenar los valores numéricos sería:*/
SELECT cast(Nombre as float) as Nombre FROM TablaX where isnumeric(Nombre)=1
order by Nombre
/*Tengo que convertir el campo Nombre a un valor numérico para poder
ordenarlo, pero lo que ocurre es que el resultado
es 1.0, 2.0, 3.0, 4.0, 10.1, 10.1999999999999. Este sería mi primer
problema, que más o menos he resuelto..

La Consulta para ordenar los valores alfanuméricos sería:*/
SELECT Nombre FROM TablaX where isnumeric(Nombre)=0 order by Nombre

INSERT INTO TablaY SELECT cast(Nombre as float)as Nombre FROM TablaX where
isnumeric(Nombre)=1 order by Nombre
/*donde inserto en TablaY el resultado de la consulta que me ordena los
valores númericos de la TablaX ,
en vez de insertar los números ordenados en esta secuencia 1, 2, 3, 4, 10.1,
10.2, automáticamente se reordenan internamente
y los inserta en orden alfanumérico, es decir: 1, 10.1, 10.2, 2, 3, 4 */
SELECT * FROM TablaY

/*
¿Por qué ocurre esto? No deberián insertarse en el mismo orden que los
devuelve la consulta
SELECT cast(Nombre as float)as Nombre FROM TablaX where isnumeric(Nombre)=1
order by Nombre ??

Mi intención es devolver en una única consulta el campo Nombre de la TablaX
ordenado de la siguiente manera:

IdTablaY Nombre
1 1
2 10.1
3 10.2
4 2
5 3
6 4
7 AC
8 AF
9 AG

Si no hiciera falta crear ninguna tabla Temporal mejor */

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
29/06/2004 - 20:47 | Informe spam
Hola Lara,
Espero que sea esto lo que necesitás, saludos... Liliana.


SELECT RIGHT(REPLICATE(' ', 50) + CAST(LTRIM(RTRIM(nombre)) AS VARCHAR ),
50)
FROM tablax WHERE ISNUMERIC(nombre) = 1
UNION
SELECT nombre FROM tablax WHERE ISNUMERIC(nombre) = 0
ORDER BY 1

"Lara" escribió en el mensaje
news:#
Hola grupo!

Tengo un problema al ordenar los valores de un campo de tipo varchar, que
contiene tanto valores núméricos como alfanuméricos.
Quiero devolver en una única consulta, primero los valores numéricos
ordenados de menor a mayor y a continuación los valores alfanuméricos
ordenados alfabéticamente. Como no he sido capaz de hacerlo en una única
Select, se me ha ocurrido crear una tabla temporal donde inserte primero


los
valores numéricos ordenados, y después los valores alfanuméicos ordenados,
por último, devolvería la Select de dicha tabla temporal.

He realizado un script abajo, con una serie de explicaciones para que
entiendan mi problema.
Muchas Gracias!
Lara



El script es todo esto:

Drop table TablaX
Drop table TablaY
CREATE TABLE TablaX (IdTablaX int IDENTITY (1,1) NOT NULL ,
Nombre varchar(50))
INSERT INTO TablaX (Nombre) values ('1')
INSERT INTO TablaX (Nombre) values ('2')
INSERT INTO TablaX (Nombre) values ('3')
INSERT INTO TablaX (Nombre) values ('4')
INSERT INTO TablaX (Nombre) values ('AF')
INSERT INTO TablaX (Nombre) values ('AC')
INSERT INTO TablaX (Nombre) values ('AG')
INSERT INTO TablaX (Nombre) values ('10.1')
INSERT INTO TablaX (Nombre) values ('10.2')

CREATE TABLE TablaY (IdTablaY int IDENTITY (1,1) NOT NULL , Nombre
varchar(50))
/*Ahora quiero insertar en la TablaY los valores del campo Nombre de la
TablaX pero en el siguiente orden:
Primero quiero que aparezcan los valores numéricos (1,2,3,4,10.1,10.2)
ordenados de menor a mayor, y a continuación
los valores alfanuméricos también ordenados (AC,AF,AG)
Lo que yo he hecho es realizar dos consultas diferentes, una para ordenar
los valores numéricos y otra consulta
para ordenar los valores alfanuméricos. No puedo unir ambas consultas,
porque en un caso en el campo Nombre voy a devolver
un número, y en el otro caso voy a devolver un texto

La consulta para ordenar los valores numéricos sería:*/
SELECT cast(Nombre as float) as Nombre FROM TablaX where


isnumeric(Nombre)=1
order by Nombre
/*Tengo que convertir el campo Nombre a un valor numérico para poder
ordenarlo, pero lo que ocurre es que el resultado
es 1.0, 2.0, 3.0, 4.0, 10.1, 10.1999999999999. Este sería mi primer
problema, que más o menos he resuelto..

La Consulta para ordenar los valores alfanuméricos sería:*/
SELECT Nombre FROM TablaX where isnumeric(Nombre)=0 order by Nombre

INSERT INTO TablaY SELECT cast(Nombre as float)as Nombre FROM TablaX where
isnumeric(Nombre)=1 order by Nombre
/*donde inserto en TablaY el resultado de la consulta que me ordena los
valores númericos de la TablaX ,
en vez de insertar los números ordenados en esta secuencia 1, 2, 3, 4,


10.1,
10.2, automáticamente se reordenan internamente
y los inserta en orden alfanumérico, es decir: 1, 10.1, 10.2, 2, 3, 4 */
SELECT * FROM TablaY

/*
¿Por qué ocurre esto? No deberián insertarse en el mismo orden que los
devuelve la consulta
SELECT cast(Nombre as float)as Nombre FROM TablaX where


isnumeric(Nombre)=1
order by Nombre ??

Mi intención es devolver en una única consulta el campo Nombre de la


TablaX
ordenado de la siguiente manera:

IdTablaY Nombre
1 1
2 10.1
3 10.2
4 2
5 3
6 4
7 AC
8 AF
9 AG

Si no hiciera falta crear ninguna tabla Temporal mejor */







Respuesta Responder a este mensaje
#2 fergek
29/06/2004 - 21:52 | Informe spam
aca te mando lo que necesitas hacer


create table temporal(
a varchar(1000)
)


select a from (
select case when isnumeric(a)=1 then 0 else 1 end as numfirst,
a,
case when isnumeric(a)=1 then convert(money, a) else 0 end as
numberformat
from temporal
)v
order by v.numfirst, numberformat, a


Lo que hace basicamente la consulta es tomar la tabla y generar tres
campos dentro de un subquery:

numfirst: pone un 0 si el dato es numerico y un 1 si no lo es.
a: el dato en sí
numberformat: si el valor que tiene la tabla es numerico, convierte
ese valor a MONEY (utilizo money por una cuestion de costumbre nada
mas). Si no, asigna un 0.

Entonces, lo que hago es ordenar por los tres campos, en el orden que
ves para que:


1) primero aparezcan los numeros, luego las cadenas
2) los numeros van a estar ordenados por numero; los alfanumericos van
a tener todos el mismo valor.
3) finalmente, para ordenar los alfanumericos

Espero haber sido de ayuda.
Respuesta Responder a este mensaje
#3 Lara
30/06/2004 - 10:33 | Informe spam
Muchísimas gracias a los dos!! me ha servido de gran ayuda!

Lara


"Lara" escribió en el mensaje
news:%
Hola grupo!

Tengo un problema al ordenar los valores de un campo de tipo varchar, que
contiene tanto valores núméricos como alfanuméricos.
Quiero devolver en una única consulta, primero los valores numéricos
ordenados de menor a mayor y a continuación los valores alfanuméricos
ordenados alfabéticamente. Como no he sido capaz de hacerlo en una única
Select, se me ha ocurrido crear una tabla temporal donde inserte primero


los
valores numéricos ordenados, y después los valores alfanuméicos ordenados,
por último, devolvería la Select de dicha tabla temporal.

He realizado un script abajo, con una serie de explicaciones para que
entiendan mi problema.
Muchas Gracias!
Lara



El script es todo esto:

Drop table TablaX
Drop table TablaY
CREATE TABLE TablaX (IdTablaX int IDENTITY (1,1) NOT NULL ,
Nombre varchar(50))
INSERT INTO TablaX (Nombre) values ('1')
INSERT INTO TablaX (Nombre) values ('2')
INSERT INTO TablaX (Nombre) values ('3')
INSERT INTO TablaX (Nombre) values ('4')
INSERT INTO TablaX (Nombre) values ('AF')
INSERT INTO TablaX (Nombre) values ('AC')
INSERT INTO TablaX (Nombre) values ('AG')
INSERT INTO TablaX (Nombre) values ('10.1')
INSERT INTO TablaX (Nombre) values ('10.2')

CREATE TABLE TablaY (IdTablaY int IDENTITY (1,1) NOT NULL , Nombre
varchar(50))
/*Ahora quiero insertar en la TablaY los valores del campo Nombre de la
TablaX pero en el siguiente orden:
Primero quiero que aparezcan los valores numéricos (1,2,3,4,10.1,10.2)
ordenados de menor a mayor, y a continuación
los valores alfanuméricos también ordenados (AC,AF,AG)
Lo que yo he hecho es realizar dos consultas diferentes, una para ordenar
los valores numéricos y otra consulta
para ordenar los valores alfanuméricos. No puedo unir ambas consultas,
porque en un caso en el campo Nombre voy a devolver
un número, y en el otro caso voy a devolver un texto

La consulta para ordenar los valores numéricos sería:*/
SELECT cast(Nombre as float) as Nombre FROM TablaX where


isnumeric(Nombre)=1
order by Nombre
/*Tengo que convertir el campo Nombre a un valor numérico para poder
ordenarlo, pero lo que ocurre es que el resultado
es 1.0, 2.0, 3.0, 4.0, 10.1, 10.1999999999999. Este sería mi primer
problema, que más o menos he resuelto..

La Consulta para ordenar los valores alfanuméricos sería:*/
SELECT Nombre FROM TablaX where isnumeric(Nombre)=0 order by Nombre

INSERT INTO TablaY SELECT cast(Nombre as float)as Nombre FROM TablaX where
isnumeric(Nombre)=1 order by Nombre
/*donde inserto en TablaY el resultado de la consulta que me ordena los
valores númericos de la TablaX ,
en vez de insertar los números ordenados en esta secuencia 1, 2, 3, 4,


10.1,
10.2, automáticamente se reordenan internamente
y los inserta en orden alfanumérico, es decir: 1, 10.1, 10.2, 2, 3, 4 */
SELECT * FROM TablaY

/*
¿Por qué ocurre esto? No deberián insertarse en el mismo orden que los
devuelve la consulta
SELECT cast(Nombre as float)as Nombre FROM TablaX where


isnumeric(Nombre)=1
order by Nombre ??

Mi intención es devolver en una única consulta el campo Nombre de la


TablaX
ordenado de la siguiente manera:

IdTablaY Nombre
1 1
2 10.1
3 10.2
4 2
5 3
6 4
7 AC
8 AF
9 AG

Si no hiciera falta crear ninguna tabla Temporal mejor */







email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida