Buscar..


Lo esencial

Primero, configuremos la tabla de ejemplo.

-- Create a table as an example
CREATE TABLE SortOrder
(
    ID INT IDENTITY PRIMARY KEY,
    [Text] VARCHAR(256)
)
GO

-- Insert rows into the table
INSERT INTO SortOrder ([Text]) 
SELECT ('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
UNION ALL SELECT ('Pellentesque eu dapibus libero')
UNION ALL SELECT ('Vestibulum et consequat est, ut hendrerit ligula')
UNION ALL SELECT ('Suspendisse sodales est congue lorem euismod, vel facilisis libero pulvinar')
UNION ALL SELECT ('Suspendisse lacus est, aliquam at varius a, fermentum nec mi')
UNION ALL SELECT ('Praesent tincidunt tortor est, nec consequat dolor malesuada quis')
UNION ALL SELECT ('Quisque at tempus arcu')
GO

Recuerde que al recuperar datos, si no especifica una cláusula de ordenamiento de filas (ORDER BY), el servidor SQL no garantiza la clasificación (orden de las columnas) en ningún momento . Realmente, en cualquier momento. Y no tiene sentido discutir sobre eso, se ha mostrado literalmente miles de veces y en todo el Internet.

No ORDER BY == sin clasificación. Fin de la historia.

-- It may seem the rows are sorted by identifiers, 
-- but there is really no way of knowing if it will always work.
-- And if you leave it like this in production, Murphy gives you a 100% that it wont.
SELECT * FROM SortOrder
GO

Hay dos direcciones de datos que se pueden ordenar por:

  • ascendiendo (moviéndose hacia arriba), usando ASC
  • descendiendo (moviéndose hacia abajo), usando DESC
-- Ascending - upwards
SELECT * FROM SortOrder ORDER BY ID ASC
GO

-- Ascending is default
SELECT * FROM SortOrder ORDER BY ID
GO

-- Descending - downwards
SELECT * FROM SortOrder ORDER BY ID DESC
GO

Cuando ordene por la columna textual ((n) char o (n) varchar), preste atención a que la orden respeta la intercalación. Para obtener más información sobre la intercalación, consulte el tema.

Ordenar y ordenar datos puede consumir recursos. Aquí es donde los índices creados correctamente son útiles. Para más información sobre los índices busque el tema.

Existe la posibilidad de pseudoaleatorizar el orden de las filas en su conjunto de resultados. Solo obliga al orden a aparecer no determinista.

SELECT * FROM SortOrder ORDER BY CHECKSUM(NEWID())
GO

El orden se puede recordar en un procedimiento almacenado, y esa es la forma en que debe hacerlo si es el último paso para manipular el conjunto de filas antes de mostrárselo al usuario final.

CREATE PROCEDURE GetSortOrder
AS
    SELECT * 
    FROM SortOrder 
    ORDER BY ID DESC
GO

EXEC GetSortOrder
GO

Existe un soporte limitado (y pirateado) para ordenar también en las vistas de SQL Server, pero se recomienda que NO lo use.

/* This may or may not work, and it depends on the way 
   your SQL Server and updates are installed */
CREATE VIEW VwSortOrder1
AS
    SELECT TOP 100 PERCENT * 
    FROM SortOrder 
    ORDER BY ID DESC
GO

SELECT * FROM VwSortOrder1
GO

-- This will work, but hey... should you really use it?
CREATE VIEW VwSortOrder2
AS
    SELECT TOP 99999999 * 
    FROM SortOrder 
    ORDER BY ID DESC
GO

SELECT * FROM VwSortOrder2
GO

Para ordenar puede usar nombres de columna, alias o números de columna en su ORDEN POR.

SELECT * 
FROM SortOrder 
ORDER BY [Text]

-- New resultset column aliased as 'Msg', feel free to use it for ordering
SELECT ID, [Text] + ' (' + CAST(ID AS nvarchar(10)) + ')' AS Msg
FROM SortOrder 
ORDER BY Msg

-- Can be handy if you know your tables, but really NOT GOOD for production
SELECT * 
FROM SortOrder 
ORDER BY 2

Aconsejo no utilizar los números en su código, excepto si desea olvidarlo al momento de ejecutarlo.

Orden por caso

Si desea ordenar sus datos numéricamente o alfabéticamente, simplemente puede usar el order by [column] . Si desea ordenar usando una jerarquía personalizada, use una declaración de caso.

Group
-----
Total
Young
MiddleAge
Old
Male
Female

Utilizando un order by básico order by :

Select * from MyTable
Order by Group

devuelve un orden alfabético, que no siempre es deseable:

Group
-----
Female
Male
MiddleAge
Old    
Total
Young

Agregando una declaración de 'caso', asignando valores numéricos ascendentes en el orden en que desea ordenar sus datos:

Select * from MyTable
Order by case Group
    when 'Total' then 10
    when 'Male' then 20
    when 'Female' then 30
    when 'Young' then 40
    when 'MiddleAge' then 50
    when 'Old' then 60
    end

Devuelve los datos en el orden especificado:

Group
-----
Total
Male
Female
Young
MiddleAge
Old


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow