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:
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:
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:
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
(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