none
Problema con ordenamiento de columna varchar RRS feed

  • Pregunta

  • Buenas tardes,

    Tengo una tabla llamara Orden_Compra la cual tiene las columnas IdOrden, IdSucursal, y Fecha.

    La columna IdOrden es de tipo varchar y los todos sus registros tienen el mismo patron: 'O-1', O-2', etc.

    Necesito hacer una consulta que me traiga el ultimo IdOrden pero en este caso no me sirve la función MAX() ya que al tener los registros 'O-9' y 'O-10' el valor máximo es 'O-9'. ¿Alguien tiene idea de como puedo solucionar esto?

    ¡Saludos!


    lunes, 19 de agosto de 2019 20:53

Respuestas

  • Hola Manuelrodgzz:

    Puedes hacer algo del estilo a esto

    CREATE TABLE orden_compra
    (ID         INT IDENTITY(1, 1), 
     idorden    VARCHAR(10), 
     idSucursal INT, 
     Fecha      DATETIME
    );
    GO
    INSERT INTO orden_compra
    (idorden, 
     idSucursal, 
     Fecha
    )
    VALUES
    ('O-8',  1,  '20190819 10:00'),
    ('O-9',  2,  '20190819 11:00'),
    ('O-10', 3,  '20190819 12:00'),
    ('O-11', 2,  '20190819 13:00');
    GO

    Solución 1

    SELECT top(1) * FROM orden_compra
    ORDER BY
    CAST(SUBSTRING(IDORDEN,3,LEN(IDORDEN)) AS INT) desc
    

    Solución 2

    ;with cte as (
    SELECT orden_compra.ID, 
           orden_compra.idorden, 
           orden_compra.idSucursal, 
           orden_compra.Fecha,
    	  Row_number() over(order by CAST(SUBSTRING(IDORDEN,3,LEN(IDORDEN)) AS INT) desc) as fila
    FROM orden_compra
    )
    select * from cte 
    where fila = 1

    Salida


    lunes, 19 de agosto de 2019 21:06

Todas las respuestas

  • Hola Manuelrodgzz:

    Puedes hacer algo del estilo a esto

    CREATE TABLE orden_compra
    (ID         INT IDENTITY(1, 1), 
     idorden    VARCHAR(10), 
     idSucursal INT, 
     Fecha      DATETIME
    );
    GO
    INSERT INTO orden_compra
    (idorden, 
     idSucursal, 
     Fecha
    )
    VALUES
    ('O-8',  1,  '20190819 10:00'),
    ('O-9',  2,  '20190819 11:00'),
    ('O-10', 3,  '20190819 12:00'),
    ('O-11', 2,  '20190819 13:00');
    GO

    Solución 1

    SELECT top(1) * FROM orden_compra
    ORDER BY
    CAST(SUBSTRING(IDORDEN,3,LEN(IDORDEN)) AS INT) desc
    

    Solución 2

    ;with cte as (
    SELECT orden_compra.ID, 
           orden_compra.idorden, 
           orden_compra.idSucursal, 
           orden_compra.Fecha,
    	  Row_number() over(order by CAST(SUBSTRING(IDORDEN,3,LEN(IDORDEN)) AS INT) desc) as fila
    FROM orden_compra
    )
    select * from cte 
    where fila = 1

    Salida


    lunes, 19 de agosto de 2019 21:06
  • ¡Muchas gracias Javi! Soy novato en bases de datos y esta información me viene de maravilla.

    Saludos!

    lunes, 19 de agosto de 2019 21:28