SELECT — предложение ORDER BY (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

Сортирует данные, возвращенные запросом в SQL Server. Это предложение используется для следующих целей:

  • Упорядочение результирующего набора запроса по заданному списку столбцов и (дополнительно) ограничение числа возвращаемых строк указанным диапазоном. Порядок возврата строк в результирующем ORDER BY наборе не гарантируется, если предложение не указано.

  • Определение порядка, в котором значения ранжирующей функции применяются к результирующему набору.

Соглашения о синтаксисе Transact-SQL

Примечание.

ORDER BY не поддерживается в инструкциях CTAS в SELECT/INTO CREATE TABLE AS SELECT Azure Synapse Analytics или Analytics Platform System (PDW).

Синтаксис

Синтаксис ДЛЯ SQL Server и База данных SQL Azure.

ORDER BY order_by_expression
    [ COLLATE collation_name ]
    [ ASC | DESC ]
    [ , ...n ]
[ <offset_fetch> ]

<offset_fetch> ::=
{
    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
    [
      FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
    ]
}

Синтаксис для Azure Synapse Analytics и параллельного хранилища данных.

[ ORDER BY
    {
    order_by_expression
    [ ASC | DESC ]
    } [ , ...n ]
]

Аргументы

order_by_expression

Указывает столбец или выражение, по которому производится сортировка результирующего набора запроса. Столбец сортировки можно указать как псевдоним имени или столбца или целое число, не отрицательное, представляющее позицию столбца в списке выбора.

Можно указать несколько столбцов сортировки. Имена столбцов должны быть уникальными. Последовательность столбцов сортировки в ORDER BY предложении определяет организацию отсортированного результирующего набора. Иными словами, результирующий набор сортируется по первому столбцу, затем упорядоченный список сортируется по второму и т. д.

Имена столбцов, на которые ссылается предложение ORDER BY , должны соответствовать псевдониму столбца или столбца в списке выбора или столбцу, определенному в таблице, указанной в FROM предложении без неоднозначности. ORDER BY Если предложение ссылается на псевдоним столбца из списка выбора, псевдоним столбца должен использоваться самостоятельно, а не как часть какого-то выражения в ORDER BY предложении, например:

SELECT SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
ORDER BY SchemaName; -- correct

SELECT SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
ORDER BY SchemaName + ''; -- wrong

COLLATE collation_name

Указывает, что ORDER BY операция должна выполняться в соответствии с параметрами сортировки, указанными в collation_name, а не в соответствии с параметрами сортировки столбца, как определено в таблице или представлении. Collation_name может быть именем сортировки Windows или именем сортировки SQL. Дополнительные сведения см. в разделе о поддержке сортировки и Юникода. COLLATEприменимо только для столбцов типа char, varchar, nchar и nvarchar.

ASC | DESC

Указывает порядок сортировки значений в указанном столбце — по возрастанию или по убыванию. Значение ASC сортирует от низких значений к высоким. Значение DESC сортирует от высоких значений к низким. Порядок сортировки по умолчанию — ASC. NULL Значения обрабатываются как наименьшие возможные значения.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

Область применения: SQL Server 2012 (11.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Указывает число сток, которые необходимо пропустить, прежде чем будет начат возврат строк из выражения запроса. Это значение может быть целочисленной константой или выражением, значение которого больше нуля или равно нулю.

offset_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. Если используется вложенный запрос, он не может ссылаться на столбцы, определенные во внешней области запроса. То есть его нельзя сопоставить с внешним запросом.

ROW и ROWS являются синонимами и предоставляются для совместимости ANSI.

В планах выполнения запросов значение счетчика строк смещения отображается в атрибуте TOP Offset оператора запроса.

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY

Область применения: SQL Server 2012 (11.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Указывает количество строк, возвращаемых после OFFSET обработки предложения. Это значение может быть целочисленной константой или выражением, значение которого больше единицы или равно единице.

fetch_row_count_expression может быть переменной, параметром или вложенным запросом, возвращающим скалярную константу. Если используется вложенный запрос, он не может ссылаться на столбцы, определенные во внешней области запроса. То есть его нельзя сопоставить с внешним запросом.

FIRST и NEXT являются синонимами и предоставляются для совместимости ANSI.

ROW и ROWS являются синонимами и предоставляются для совместимости ANSI.

В планах выполнения запросов значение счетчика строк смещения отображается в атрибуте TOP Rows или Top оператора запроса.

Рекомендации

Избегайте указания целых чисел в предложении в ORDER BY качестве позиционных представлений столбцов в списке выбора. Например, хотя оператор SELECT ProductID, Name FROM Production.Production ORDER BY 2 является допустимым, оператор не так легко понимается другими пользователями по сравнению с указанием фактического имени столбца. Кроме того, изменения в списке выбора, такие как изменение порядка столбцов или добавление новых столбцов, требуют изменения ORDER BY предложения, чтобы избежать непредвиденных результатов.

В инструкции SELECT TOP (<n>) всегда используйте ORDER BY предложение. Это единственный способ прогнозировать, какие строки затрагиваются TOP. Дополнительные сведения см. в разделе TOP.

Совместимость

При использовании с оператором SELECT...INTO или INSERT...SELECT инструкцией для вставки строк из другого источника ORDER BY предложение не гарантирует вставку строк в указанном порядке.

Использование OFFSET и FETCH в представлении не изменяет свойство возможности обновления представления.

Ограничения

Количество столбцов в ORDER BY предложении не ограничено. Однако общий размер столбцов, указанных в ORDER BY предложении, не может превышать 8060 байт.

Столбцы типа ntext, text, image, geography, geometry и xml нельзя использовать в предложенииORDER BY.

Целое число или константа нельзя указать, когда order_by_expression отображается в функции ранжирования. Дополнительные сведения см. в предложении SELECT - OVER.

Если имя таблицы является псевдонимом в FROM предложении, для определения столбцов в ORDER BY предложении можно использовать только имя псевдонима.

Имена столбцов и псевдонимы, указанные в ORDER BY предложении, должны быть определены в списке выбора, если инструкция SELECT содержит одно из следующих предложений или операторов:

  • Оператор UNION
  • Оператор EXCEPT
  • Оператор INTERSECT
  • SELECT DISTINCT

Кроме того, если инструкция включает UNIONоператор или EXCEPTINTERSECT оператор, имена столбцов или псевдонимы столбцов, необходимо указать в списке выбора первого (левого) запроса.

В запросе, использующего UNIONоператоры или EXCEPTINTERSECT операторы, ORDER BY разрешено только в конце инструкции. Это ограничение применяется только при указании UNION, EXCEPTа также в запросе верхнего уровня, а INTERSECT не в вложенных запросах. См. раздел "Примеры", приведенный ниже.

Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах и вложенных запросах, если TOP не указаны или OFFSET FETCH не указаны предложения. При ORDER BY использовании в этих объектах предложение используется только для определения строк, возвращаемых предложением TOP или OFFSET FETCH предложениями. Предложение ORDER BY не гарантирует упорядоченные результаты при запросе этих конструкций, если ORDER BY в самом запросе не указано.

OFFSET и FETCH не поддерживаются в индексированных представлениях или в представлении, определяемом CHECK OPTION с помощью предложения.

OFFSET и FETCH его можно использовать в любом запросе, который позволяет TOP и ORDER BY с помощью следующих ограничений:

  • Предложение OVER не поддерживает OFFSET и FETCH.

  • OFFSETи FETCH не может быть указан непосредственно в INSERTинструкциях , MERGEUPDATEи DELETE операторов, но их можно указать в вложенных запросах, определенных в этих инструкциях. Например, в инструкции INSERT INTO SELECT OFFSET можно FETCH указать в инструкции SELECT .

  • В запросе, использующего UNIONEXCEPT операторы или INTERSECT операторы, можно FETCH указать только в окончательном запросе, OFFSET который указывает порядок результатов запроса.

  • TOP Не удается объединить и OFFSET FETCH в одном выражении запроса (в той же области запроса).

Использование OFFSET и FETCH для ограничения возвращаемых строк

Следует использовать OFFSET предложения и FETCH предложения вместо TOP предложения для реализации решения по страницам запросов и ограничения количества строк, отправленных клиентскому приложению.

Для использования OFFSET и FETCH в качестве решения для разбиения на страницы требуется выполнение запроса по одному разу для каждой страницы данных, возвращаемых клиентскому приложению. Например, чтобы вернуть результаты запроса в 10 строк, необходимо выполнить запрос один раз, чтобы вернуть строки 1–10, а затем снова запустить запрос, чтобы вернуть строки 11–20 и т. д. Каждый запрос выполняется независимо и никаким образом не связан с другими запросами. Это означает, что в отличие от использования курсора, где запрос выполняется всего один раз, а текущее состояние хранится на сервере, за отслеживание состояния отвечает клиентское приложение. Чтобы достичь стабильных результатов между запросами с помощью OFFSET FETCHи следующими условиями, необходимо выполнить следующие условия:

  1. Базовые данные, используемые запросом, должны быть неизменными. То есть строки, касающиеся запроса, не обновляются или все запросы страниц из запроса выполняются в одной транзакции с помощью изоляции моментальных снимков или сериализуемых транзакций. Дополнительные сведения об этих уровнях изоляции транзакций см. в разделе SET TRANSACTION ISOLATION LEVEL.

  2. Предложение ORDER BY содержит столбец или сочетание столбцов, которые гарантированно будут уникальными.

См. пример "Выполнение нескольких запросов в одной транзакции" в разделе "Примеры" далее в этой статье.

Если согласованные планы выполнения важны в решении по страницам, рассмотрите возможность использования OPTIMIZE FOR указания запроса для OFFSET параметров и FETCH параметров. См. раздел "Указание выражений" для значений OFFSET и FETCH в разделе "Примеры " далее в этой статье. Дополнительные сведения см. в OPTIMIZE FORразделе "Подсказки запросов".

Примеры

Примеры кода Transact-SQL в этой статье используют AdventureWorks2022 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.

Категория Используемые элементы синтаксиса
Основной синтаксис ORDER BY
Укажите порядок возрастания и убывания DESC или ASC
Указание параметров сортировки COLLATE
Указание условного порядка Выражение CASE
Использование ORDER BY в функции ранжирования Ранжирующие функции
Ограничение количества возвращаемых строк OFFSET и FETCH.
Использование ORDER BY с UNION, EXCEPT и INTERSECT UNION

Основной синтаксис

Примеры в этом разделе демонстрируют основные функциональные возможности ORDER BY предложения с помощью минимального обязательного синтаксиса.

А. Указание одного столбца, определенного в списке выбора

В следующем примере производится упорядочение результирующего набора по числовому столбцу ProductID. Так как определенный порядок сортировки не указан, используется значение по умолчанию (по возрастанию).

USE AdventureWorks2022;
GO

SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;

B. Укажите столбец, который не определен в списке выбора

В следующем примере показано, как упорядочить результирующий набор столбцом, который не включен в список выбора, но определен в таблице, указанной в предложении FROM .

USE AdventureWorks2022;
GO

SELECT ProductID, Name, Color
FROM Production.Product
ORDER BY ListPrice;

C. Укажите псевдоним в качестве столбца сортировки

В следующем примере в качестве столбца сортировки указывается псевдоним столбца SchemaName.

USE AdventureWorks2022;
GO

SELECT name, SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;

D. Указание выражения в качестве столбца сортировки

В следующем примере в качестве столбца сортировки используется выражение. Выражение определяется с помощью DATEPART функции для сортировки результирующих наборов по году, в котором были наняты сотрудники.

USE AdventureWorks2022;
GO

SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY DATEPART(year, HireDate);

Указание порядка сортировки по возрастанию и убыванию

А. Указание порядка убывания

В следующем примере производится упорядочение результирующего набора по числовому столбцу ProductID в убывающем порядке.

USE AdventureWorks2022;
GO

SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;

B. Укажите порядок возрастания

В следующем примере производится упорядочение результирующего набора по столбцу Name в возрастающем порядке. Символьные значения сортируются в алфавитном порядке, а не в числовом. Иными словами, отсортированное значение 10 находится перед 2.

USE AdventureWorks2022;
GO

SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC;

C. Укажите порядок возрастания и убывания

В следующем примере производится упорядочение результирующего набора по двум столбцам. Результирующий набор запроса сначала сортируется по возрастанию по столбцу FirstName, а затем в убывающем порядке по столбцу LastName.

USE AdventureWorks2022;
GO

SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC;

Указание параметров сортировки

В следующем примере показано, как указать параметры сортировки в ORDER BY предложении может изменить порядок возврата результатов запроса. Созданная таблица содержит столбец, определенный без учета регистра и параметров сортировки диакритических знаков. Значения вставляются с различными различиями регистра и акцента. Так как параметры сортировки не указаны в ORDER BY предложении, первый запрос использует параметры сортировки столбца при сортировке значений. Во втором запросе в предложении указывается ORDER BY параметры сортировки с учетом регистра, чувствительные к регистру, которые изменяют порядок возврата строк.

USE tempdb;
GO

CREATE TABLE #t1 (name NVARCHAR(15) COLLATE Latin1_General_CI_AI);
GO

INSERT INTO #t1
VALUES (N'Sánchez'),
    (N'Sanchez'),
    (N'sánchez'),
    (N'sanchez');

-- This query uses the collation specified for the column 'name' for sorting.
SELECT name
FROM #t1
ORDER BY name;

-- This query uses the collation specified in the ORDER BY clause for sorting.
SELECT name
FROM #t1
ORDER BY name COLLATE Latin1_General_CS_AS;

Указание условного порядка

В следующих примерах выражение в ORDER BY предложении используется CASE для условного определения порядка сортировки строк на основе заданного значения столбца. В первом примере вычисляется значение столбца SalariedFlag таблицы HumanResources.Employee. Сотрудники, для которых столбец SalariedFlag имеет значение 1, возвращаются в порядке BusinessEntityID (по убыванию). Сотрудники, для которых столбец SalariedFlag имеет значение 0, возвращаются в порядке BusinessEntityID (по возрастанию). Во втором примере результирующий набор упорядочивается по столбцу TerritoryName, если столбец CountryRegionName содержит значение «США», и по столбцу CountryRegionName в остальных строках.

SELECT BusinessEntityID,
    SalariedFlag
FROM HumanResources.Employee
ORDER BY
    CASE SalariedFlag
        WHEN 1 THEN BusinessEntityID
    END DESC,
    CASE 
        WHEN SalariedFlag = 0 THEN BusinessEntityID
    END;
GO
SELECT BusinessEntityID,
    LastName,
    TerritoryName,
    CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY
    CASE CountryRegionName
        WHEN 'United States' THEN TerritoryName
        ELSE CountryRegionName
    END;

Использование ORDER BY в функции ранжирования

В следующем примере используется ORDER BY предложение в функциях ROW_NUMBERранжирования , RANKи DENSE_RANKNTILE.

USE AdventureWorks2022;
GO

SELECT p.FirstName,
    p.LastName,
    ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number",
    RANK() OVER (ORDER BY a.PostalCode) AS "Rank",
    DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank",
    NTILE(4) OVER (ORDER BY a.PostalCode) AS "Quartile",
    s.SalesYTD,
    a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
    ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
    ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
    AND SalesYTD <> 0;

Ограничение количества возвращаемых строк

Область применения: SQL Server 2012 (11.x) и более поздних версий, База данных SQL Azure и Управляемый экземпляр SQL Azure.

В следующих примерах используется OFFSET и FETCH ограничивается количество строк, возвращаемых запросом.

А. Указание целых констант для значений OFFSET и FETCH

В следующем примере указывается целочисленная константа в качестве значения для OFFSET предложений и FETCH предложений. Первый запрос возвращает все строки, отсортированные по столбцу DepartmentID. Сравните результаты, возвращенные этим запросом, с результатами двух следующих запросов. Следующий запрос использует предложение OFFSET 5 ROWS , чтобы пропустить первые пять строк и вернуть все оставшиеся строки. Конечный запрос содержит предложение OFFSET 0 ROWS, чтобы начать с первой строки, а затем предложение FETCH NEXT 10 ROWS ONLY, ограничивающее число возвращаемых строк до 10 из сортированного результирующего набора.

USE AdventureWorks2022;
GO

-- Return all rows sorted by the column DepartmentID.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID;

-- Skip the first 5 rows from the sorted result set and return all remaining rows.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 5 ROWS;

-- Skip 0 rows and return only the first 10 rows from the sorted result set.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

B. Указание переменных для значений OFFSET и FETCH

В следующем примере объявляют переменные и @FetchRows указываются эти переменные @RowsToSkip в OFFSET предложениях и FETCH предложениях.

USE AdventureWorks2022;
GO

-- Specifying variables for OFFSET and FETCH values
DECLARE
    @RowsToSkip TINYINT = 2,
    @FetchRows TINYINT = 8;

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @RowsToSkip ROWS
FETCH NEXT @FetchRows ROWS ONLY;

C. Указание выражений для значений OFFSET и FETCH

В следующем примере выражение @StartingRowNumber - 1 используется для указания OFFSET значения и выражения @EndingRowNumber - @StartingRowNumber + 1 для указания значения FETCH. Кроме того, указывается указание OPTIMIZE FORзапроса. Это указание можно использовать, чтобы предоставить конкретное значение для локальной переменной при компиляции и оптимизации запросов. Значение используется только в процессе оптимизации запроса, но не в процессе выполнения. Дополнительные сведения см. в указаниях запросов.

USE AdventureWorks2022;
GO

-- Specifying expressions for OFFSET and FETCH values
DECLARE
    @StartingRowNumber TINYINT = 1,
    @EndingRowNumber TINYINT = 8;

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY
OPTION (OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20));

D. Указание скалярного запроса констант для значений OFFSET и FETCH

В следующем примере используется константный скалярный вложенный запрос для определения значения предложения FETCH . Вложенный запрос возвращает единственное значение из столбца PageSize в таблице dbo.AppSettings.

-- Specifying a constant scalar subquery
USE AdventureWorks2022;
GO

CREATE TABLE dbo.AppSettings (
    AppSettingID INT NOT NULL,
    PageSize INT NOT NULL
);
GO

INSERT INTO dbo.AppSettings
VALUES (1, 10);
GO

DECLARE @StartingRowNumber TINYINT = 1;

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber ROWS
FETCH NEXT (
    SELECT PageSize
    FROM dbo.AppSettings
    WHERE AppSettingID = 1
) ROWS ONLY;

Е. Выполнение нескольких запросов в одной транзакции

В следующем примере показан один из методов реализации решения разбиения на страницы, который обеспечивает стабильные результаты, возвращаемые во всех запросах. Запрос выполняется в одной транзакции с помощью уровня изоляции моментального снимка, а столбец, указанный в ORDER BY предложении, гарантирует уникальность столбца.

USE AdventureWorks2022;
GO

-- Ensure the database can support the snapshot isolation level set for the query.
IF (
    SELECT snapshot_isolation_state
    FROM sys.databases
    WHERE name = N'AdventureWorks2022'
) = 0
ALTER DATABASE AdventureWorks2022
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

-- Set the transaction isolation level  to SNAPSHOT for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO

-- Beginning the transaction.
BEGIN TRANSACTION;
GO

-- Declare and set the variables for the OFFSET and FETCH values.
DECLARE
    @StartingRowNumber INT = 1,
    @RowCountPerPage INT = 3;

-- Create the condition to stop the transaction after all rows have been returned.
WHILE (
    SELECT COUNT(*)
    FROM HumanResources.Department
) >= @StartingRowNumber
BEGIN
    -- Run the query until the stop condition is met.
    SELECT DepartmentID, Name, GroupName
    FROM HumanResources.Department
    ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS
    FETCH NEXT @RowCountPerPage ROWS ONLY;

    -- Increment @StartingRowNumber value.
    SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;

    CONTINUE
END;
GO

COMMIT TRANSACTION;
GO

Использование ORDER BY с UNION, EXCEPT и INTERSECT

Если запрос использует UNIONEXCEPTоператоры или INTERSECT операторы, ORDER BY предложение должно быть указано в конце инструкции, а результаты объединенных запросов сортируются. В следующем примере возвращаются все продукты желтого или красного цвета, отсортированные в общем списке по столбцу ListPrice.

USE AdventureWorks2022;
GO

SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Red'
-- ORDER BY cannot be specified here.

UNION ALL

SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Yellow'
ORDER BY ListPrice ASC;

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

В следующем примере демонстрируется упорядочение результирующего набора по числовому столбцу EmployeeKey в возрастающем порядке.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey;

В следующем примере производится упорядочение результирующего набора по числовому столбцу EmployeeKey в убывающем порядке.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey DESC;

В следующем примере производится упорядочение результирующего набора по столбцу LastName.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName;

В следующем примере производится упорядочение по двум столбцам. Этот запрос сначала сортирует в возрастающем порядке по столбцу FirstName, а затем сортирует общие значения FirstName в убывающем порядке по столбцу LastName.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName, FirstName;