none
Ordenar columnas, sólo la primera llevarla hasta el final RRS feed

  • Pregunta

  • Buenas a todos, Manejo SQL Server 2016, en mi tabla dbo.[Productos] tengo la siguiente información:

    

    (lo que tengo)

    esa información me arroja el SELECT al aplicarle ORDER BY Clave ASC, me da la información tal cual la quiero ordenada, a excepción de un detalle, lo que busco es que la fila con clave 00 aparezca al último de los registros, es decir, al final de todos los registros ordenados en forma Ascendente a excepción del registro con clave 00 como lo ilustro a continuación.

     

    (lo que necesito)

    Gracias.

    sábado, 20 de julio de 2019 0:05

Todas las respuestas

  • Hola AlvaroLanda:

    Puedes aplicar una expresión case en el order by.

    DECLARE @Productos TABLE
    (clave  VARCHAR(10), 
     nombre VARCHAR(20), 
     monto  MONEY
    );
    INSERT INTO @productos
    (clave, 
     nombre, 
     monto
    )
    VALUES
    ('00',  'Producto 1',  6000),
    ('1',  'Producto 2',  435435),
    ('2',  'Producto 3',  234324),
    ('3',  'Producto 4',  23),
    ('4',  'Producto 5',  1221),
    ('5',  'Producto 6',  null),
    ('6',  'Producto 7',  null),
    ('7',  'Producto 8',  null),
    ('8',  'Producto 9',  223),
    ('9',  'Producto 10',  12354);
    
    SELECT p.clave, 
           p.nombre, 
           p.monto
    FROM @Productos p
    order by
    case when p.clave = '00' then 2147483647 
         else p.clave end asc

    O su equivalente siendo caracteres

    DECLARE @Productos TABLE
    (clave  VARCHAR(10), 
     nombre VARCHAR(20), 
     monto  MONEY
    );
    INSERT INTO @productos
    (clave, 
     nombre, 
     monto
    )
    VALUES
    ('00',  'Producto 1',  6000),
    ('1',  'Producto 2',  435435),
    ('2',  'Producto 3',  234324),
    ('3',  'Producto 4',  23),
    ('4',  'Producto 5',  1221),
    ('5',  'Producto 6',  null),
    ('6',  'Producto 7',  null),
    ('7',  'Producto 8',  null),
    ('8',  'Producto 9',  223),
    ('9',  'Producto 10',  12354);
    
    SELECT p.clave, 
           p.nombre, 
           p.monto
    FROM @Productos p
    order by
    case when p.clave = '00' then 'ZZZZ' 
         else p.clave end asc

    Case

    https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

    Salida

    (10 filas afectadas)
    clave      nombre               monto
    ---------- -------------------- ---------------------
    1          Producto 2           435435,00
    2          Producto 3           234324,00
    3          Producto 4           23,00
    4          Producto 5           1221,00
    5          Producto 6           NULL
    6          Producto 7           NULL
    7          Producto 8           NULL
    8          Producto 9           223,00
    9          Producto 10          12354,00
    00         Producto 1           6000,00
    (10 filas afectadas)

    • Propuesto como respuesta eRiver1 domingo, 21 de julio de 2019 3:00
    sábado, 20 de julio de 2019 5:56
  • Álvaro, aquí hay otra solución:

    -- código #1
    SELECT Clave, Nombre, Monto
      from dbo.Productos
      order by case when Clave = '00' then 1 else 0 end,
               Clave;

    El código considera que el contenido de Clave es texto.

     

    Si esta respuesta te ayudó a resolver tu problema, recuerda proponerla.


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Propuesto como respuesta eRiver1 domingo, 21 de julio de 2019 3:00
    sábado, 20 de julio de 2019 11:00
  • Hola ÁlvaroLanda

    puedes usar también

    ORDER_BY cast(clave as int) ASC

    Déjeme saber sus comentarios

    Gracias por usar los foros de MSDN.
    Erick Rivera
     ____
    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. 
    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    domingo, 21 de julio de 2019 3:01