Diferentes métodos para ordenar los resultados de una consulta

Por defecto, el orden de los resultados de una consulta en SQL Server no están garantizados de una forma determinada, por lo tanto, un programador debe ser explícito indicando el orden que desea. T-SQL permite indicar el orden de los resultados con la cláusula ORDER BY.

Una cláusula ORDER BY permite que los resultados sean ordenados mediante una o varias columnas de la consulta, pero también permite que se utilicen como criterio para ordenar los resultados, una columna que no está incluida en la consulta y también por otros métodos un poco mas complicados que el orden alfabético o numérico de un campo.

Creación de datos de ejemplo en SQL Server

Veamos entonces algunos ejemplos.  Vamos a crear una tabla que contenga los ganadores de la Medalla de Honor del Ejército:

create table dbo.MedalOfHonor (
 Id int identity (1,1) primary key,
 MilRank varchar(50),
 SoldierName varchar(50),
 YearOfAction varchar(4)
 )

insert into dbo.MedalOfHonor (MilRank, SoldierName, YearOfAction)
values
 ('Staff Sergeant', 'Ty Carter', '2009'),
 ('Captain', 'Florent Groberg', '2012'),
 ('Major', 'William D. Swenson', '2009'),
 ('Sergeant First Class', 'Jared C. Monti', '2006'),
 ('Master Sergeant', 'Leroy Petry', '2008'),
 ('Sergeant', 'Kyle White', '2007'),
 ('Specialist', 'Ross A. McGinnis', '2006')


 

Inicia 21 de Noviembre

 

 

 

Ejemplo simple de ordenamiento en SQL Server

Queremos ordenar los datos por el ranking militar (campo MilRank). Si utilizamos una cláusula ORDER BY para ordenar por el campo MilRank, será ordenado entonces alfabeticamente.

select 
    MilRank, SoldierName, YearOfAction
from 
    dbo.MedalOfHonor
order by 
    MilRank

 

El resultado de la consulta será el siguiente:

Simple SQL Server Sort Example

 

Ordenando los resultados de SQL Server utilizando una columna no incluida en la consulta

Para ordenar los datos por el ranking actual (PayGrade) y no el nombre del ranking (MilRank), vamos a crear otra tabla que nos provea este orden que queremos utilizar.


create table dbo.RankToPayGrade (
 MilRank varchar(50) primary key, 
 PayGrade varchar(4) )

insert into dbo.RankToPayGrade (MilRank, PayGrade)
values
 ('Staff Sergeant', 'E-6'),
 ('Captain', 'O-3'),
 ('Major', 'O-4'),
 ('Sergeant First Class', 'E-7'),
 ('Master Sergeant', 'E-8'),
 ('Sergeant', 'E-5'),
 ('Specialist', 'E-4')

select 
 M.MilRank, M.SoldierName, M.YearOfAction
from
 dbo.MedalOfHonor M
 left join dbo.RankToPayGrade R on R.MilRank = M.MilRank
order by
 R.PayGrade

 

 

Inicia 21 de Noviembre

 

 

 

 

El resultado entonces es ordenado por el campo PayGrade, aunque dicho campo no está incluido para mostrarse en el resultado, tal como muestra la imagen:

Sorting SQL Server Results Using an Unreturned Column

 

Orden en SQL Server utilizando una función

Dado que SQL Server permite expresiones completas en la cláusula ORDER BY, también podemos utilizar funciones. Como la tabla MedalOfHonor no separa el nombre del apellido, si quisiéramos ordenar por el apellido debemos utilizar una función para extraer ese dato.

select 
 M.MilRank, M.SoldierName, M.YearOfAction
from
 dbo.MedalOfHonor M
order by
 SUBSTRING(M.SoldierName, len(M.SoldierName) - charindex(' ', 
 REVERSE(M.SoldierName))+2, len(M.SoldierName))

 

La siguiente imagen nos muestra el resultado, ordenado por el apellido:

 

SQL Server Sort Using a Function

 

Inicia 21 de Noviembre

 

 

 

 

Orden en SQL Server utilizando un Alias

La cláusula ORDER BY  puede utilizar un alias de un determinado campo, por lo tanto, si queremos mostrar el apellido y utilizarlo como criterio de orden, lo podemos hacer de la siguiente forma:


select 
 SUBSTRING(M.SoldierName, len(M.SoldierName) - charindex(' ', REVERSE(M.SoldierName))+2, 
 len(M.SoldierName)) as LastName,
 M.YearOfAction, M.MilRank 
from
 dbo.MedalOfHonor M
order by
 LastName

 

SQL Server Sort Using a Column Alias
(Fuente: https://www.mssqltips.com)

Conclusión

La cláusula ORDER BY acepta expresiones SQL, esto significa que si queremos ordenar los resultados de una forma diferente a la alfabética de un campo tipo VARCHAR, hay algunas formas de hacerlo. El ordenamiento puede ser determinado por otro campo, aún si dicho campo no está incluido en el resultado. También podemos ordenar los datos a través de funciones o alias de algún campo.

 

Inicia 21 de Noviembre