none
Problemas con query al ordenar segun numero sql RRS feed

  • Pregunta

  • Hola.

    Me podrían ayudar con esto, tengo una tabla en la cual hay un campos código desde visual basic hago la consulta para que me traiga eso a una grid y los ordene según el código , pero me aparecen desordenados:

    Código:

    07
    08
    09
    10
    100
    101
    102
    109
    11
    110
    111
    112
    12
    123
    124
    13
    ...

    Porque pasa eso?, como puedo hacer para que aparescan en orden?:

    07
    08
    09
    10
    11
    12
    13
    14
    15
    100
    101
    102
    ...

    Gracias

    martes, 25 de junio de 2013 21:31

Respuestas

  • Esto está sucediendo precisamente, por eso, por que es un varchar, y los caracteres se leen de uno en uno

    es decir:

    1

    1-1 --> va antes que el 2

    2

    2-0--> va antes que el 3 (igual que antes)

    3

    por así decirlo las comparaciones van de uno en uno y debes castear a numero primero.

    lo que debes mirar, es cuando te traes los datos al Grid, si usas un DataReader o una lista.

    una forma adicional a como comenta Jose Barba es este:

    select Convert(integer, CampoInt) as Prueba
    from tabla1
    

     Saludos
    • Propuesto como respuesta HunchbackMVP miércoles, 26 de junio de 2013 13:22
    • Marcado como respuesta Uriel Almendra jueves, 12 de septiembre de 2013 20:59
    martes, 25 de junio de 2013 22:16

Todas las respuestas

  • Hola que tipo de dato es tu columna "código"?

    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    martes, 25 de junio de 2013 21:39
  • Varchar (4)
    martes, 25 de junio de 2013 21:40
  • Hola prueba de esta forma aunque lo idea sería que esa columna fuera Integer

    SELECT CODIGO FROM TU_TABLA ORDER BY CAST(CODIGO AS INT) ASC


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    martes, 25 de junio de 2013 21:55
  • me los continua listando en desorden
    martes, 25 de junio de 2013 21:58
  • Cual es el query que estás ejecutando podrías mostrarlo?

    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    martes, 25 de junio de 2013 22:06
  • select codigo AS 'Código', sistema AS 'Sistema', nombre AS 'Nombre Movimiento',
    from cvta01

    where 1 = 1 ORDER BY CAST(codigo AS INT) ASC

    martes, 25 de junio de 2013 22:10
  • Esto está sucediendo precisamente, por eso, por que es un varchar, y los caracteres se leen de uno en uno

    es decir:

    1

    1-1 --> va antes que el 2

    2

    2-0--> va antes que el 3 (igual que antes)

    3

    por así decirlo las comparaciones van de uno en uno y debes castear a numero primero.

    lo que debes mirar, es cuando te traes los datos al Grid, si usas un DataReader o una lista.

    una forma adicional a como comenta Jose Barba es este:

    select Convert(integer, CampoInt) as Prueba
    from tabla1
    

     Saludos
    • Propuesto como respuesta HunchbackMVP miércoles, 26 de junio de 2013 13:22
    • Marcado como respuesta Uriel Almendra jueves, 12 de septiembre de 2013 20:59
    martes, 25 de junio de 2013 22:16
  • Gracias :)
    martes, 25 de junio de 2013 22:18
  • veamos inténtalo de esta forma:

    select cast(codigo as int) as codigo from tu cvta01 order by codigo


    Si se solucionó tu consulta no olvides marcar la respuesta. Saludos

    martes, 25 de junio de 2013 22:19
  • Si ejecutas esto desde el SSMS, tambien te trae desordenado?

    SELECT CODIGO FROM TU_TABLA ORDER BY CAST(CODIGO AS INT) ASC

    Si no lo hace, y en tu aplicacion aparecen desordados, tienes que revisar la app, el datatable, la grilla o alguna otra cosa si no está volviendo a aplicar un orden..

    martes, 25 de junio de 2013 23:20
  • Entonces el problema esta ahora fuera de SQL Server. Quizas en la interface de comunicacion que usas con la db o en la aplicacion cliente.

    SET NOCOUNT ON;
    USE tempdb;
    GO
    DECLARE @T TABLE (
    c1 varchar(10) NOT NULL
    );
    
    INSERT INTO @T (c1)
    VALUES
    	('07'),
    	('08'),
    	('09'),
    	('10'),
    	('100'),
    	('101'),
    	('102'),
    	('109'),
    	('11'),
    	('110'),
    	('111'),
    	('112'),
    	('12'),
    	('123'),
    	('124'),
    	('13');
    
    SELECT
    	c1
    FROM
    	@T
    ORDER BY
    	c1;
    
    SELECT
    	c1
    FROM
    	@T
    ORDER BY
    	CAST(c1 AS int);
    
    SELECT
    	c1
    FROM
    	@T
    ORDER BY
    	RIGHT(REPLICATE('0', 10) + c1, 10);
    GO

    Si ejecutas este codigo en SSMS, entonces veras que el primer resultado replica tu problema y el cual se debe a la explicacion dada por Jnavero. Los otros dos resultados estan ordenados correctamente, el uno por el valor entero y el otro rellenando con ceros por la izquierda los codigos asi la comparacion caracter a caracter esta comparando manzanas con manzanas.


    AMB

    Some guidelines for posting questions...

    miércoles, 26 de junio de 2013 13:29