Программирование >>  Программирование баз данных 

1 ... 24 25 26 [ 27 ] 28 29 30 ... 346


В данном случае полученные данные отсортированы двумя способами: OrderDate CustomerlD

2001-07-09 00:00:00.000 11025

2001-07-09 00:00:00.000 11238

2001-07-09 00:00:00.000 16629

2001-07-09 00:00:00.000 25861

2001-07-09 00:00:00.000 27577

2001-07-09 00:00:00.000 27666

2001-07-08 00:00:00.000 13258

2001-07-08 00:00:00.000 14560

2001-07-08 00:00:00.000 16607

(9 row(s) affected)

Значения CustomerlD по-прежнему были отсортированы в порядке возрастания (как принято по умолчанию), поскольку в операторе выборки не содержатся какие-либо иные указания, но, как показывают полученные результаты, заказы, размещенные 9-го числа, расположены перед заказами от 8-го числа, т.е. в порядке убывания даты.

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

Агрегирование данных с использованием

конструкции GROUP BY

Описание конструкции ORDER BY в настоящей главе приведено не в той последовательности, в которой представлены конструкции в описании оператора SELECT, приведенном в начале главы. Еще раз рассмотрим полное определение структуры этого оператора:

SELECT <column list>

[FROM <source table(s)>]

[WHERE <restrictive condition>]

[GROUP BY <column name or expression using a column in the SELECT list>] [HAVING <restrictive condition based on the GROUP BY results>] [ORDER BY <column list>]

[[FOR XML] [RAW, AUTO, EXPLICIT][, XMLDATA][, ELEMENTS][, BINARY base 64]] [OPTION (<query hint>, [, -n])]

Очевидно, что конструкция ORDER BY находится на одном из последних мест, но рассматривалась прежде, чем конструкция GROUP BY. На это есть две причины, описанные ниже.

Конструкция ORDER BY используется гораздо чаще, чем GROUP BY, поэтому целесообразно больше времени посвятить ее изучению.

Желательно, чтобы читатель понял, что он может произвольно соединять и согласовывать все конструкции, которые следуют за конструкцией FROM, при условии, что порядок их расположения будет соответствовать тому, который готова принять СУБД SQL Server (и который определен в описании синтаксиса).



Конструкция GROUP BY предназначена для агрегирования информации. Рассмотрим простой запрос без конструкции GROUP BY. Предположим, что требуется узнать, сколько деталей было заказано в каком-то конкретном наборе заказов:

SELECT SalesOrderlD, OrderQty FROM Sales.SalesOrderDetail

WHERE lesOrderlD BETWEEN 43684 AND 43686;

Выполнение этого запроса приводит к получению следующего результирующего набора:

SalesOrderlD OrderQty

43684 2

43684 2

43684 1

43684 2

43684 1

43684 1

43685 3 43685 1 43685 1

43685 1

43686 3 43686 1 43686 1

(13 row(s) affected)

Нам действительно требовалось получить только итоговые данные по трем заказам, но была выведена каждая отдельная строка расшифровки из каждого заказа. Безусловно, можно было бы получить требуемые результаты, подсчитав количество строк с помощью калькулятора, но проще воспользоваться конструкцией GROUP BY с агрегирующей функцией; в данном случае будет применяться агрегирующая функция SUM ():

SELECT SalesOrderlD, SUM(OrderQty) FROM Sales.SalesOrderDetail

WHERE SalesOrderlD BETWEEN 43684 AND 43686 GROUP BY SalesOrderlD;

Выполнение этого запроса приводит к получению требуемых результатов: SalesOrderlD

43684 9

43685 6

43686 5

(3 row(s) affected)

Как и следовало ожидать, функция SUM возвращает итоговые результаты, но к чему относятся эти итоги? Если не задана конструкция GROUP BY, то результаты, полученные с помощью функции зим, охватывают все значения из всех строк в заданном столбце. Но в данном случае конструкция GROUP BY предусмотрена, поэтому суммы, подсчитанные с помощью функции SUM, являются итогами для каждой группы.

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

Обратите внимание на то, что при использовании конструкции GROUP BY каждый столбец в списке выборки оператора SELECT должен представлять собой либо столбец, указанный в конструкции GROUP BY, либо результат агрегирования. Какие выводы из этого следуют? Рассмотрению этой темы посвящен следующий раздел.



Агрегирующие функции

Анализ данных, которые обычно формируются с использованием конструкции GROUP BY, показывает, что эти данные представляют собой результаты агрегирования с помощью функций, воздействующих на группы данных. Например, в одном из приведенных выше запросов была получена сумма по столбцу Quantity. Эта сумма была рассчитана по выбранному столбцу и возвращена применительно к каждой группе, определенной в конструкции GROUP BY; в данном случае рассматривался только столбец OrderlD. Количество различных агрегирующих функций весьма велико, но в настоящей главе будут рассматриваться только наиболее распространенные.

Агрегирующие функции становятся наиболее удобными при использовании в сочетании с конструкцией GROUP BY. Но возможность их применения не ограничивается группированньши запросажи (запросами с конструкцией GROUP BY). Если агрегирующая функция применяется в запросе без конструкции GROUP BY, то ее действие распространяется на весь результирующий набор (на все строки, которые соответствуют конструкции WHERE). Здесь важнее всего понять, что в запросах без конструкции GROUP BY некоторые агрегирующие функции могут применяться в списке выборки только в сочетании с другими агрегирующими функциями. Иными словами, если конструкция GROUP BY не предусмотрена, то оператор выборки не может содержать агрегирующие функции, парные по отношению к именам столбцов в списке выборки. Например, если отсутствует конструкция GROUP BY, то функция AVG может применяться только в сочетании с функцией SUM, но не с определенным столбцом.

Функция AVG

Эта функция применяется для вычисления средних значений. К этому описанию трудно что-либо добавить.

Функции MIN и МАХ

Имена этих функций говорят сами за себя. Данные функции действительно определяют минимальное и максимальное значения для каждой группировки в выбранном столбце. И в этом случае мы не можем отметить каких-то из рада вон выходящих особенностей этих функций.

Функция COUNT (Expression / *;

Функция COUNT (*) предназначена для вычисления количества строк в результатах запроса. Для начала рассмотрим одну из наиболее широко применяемых разновидностей запроса:

SELECT COUNT(*)

FROM HumanResources.Employee

WHERE EmployeelD = 3

ICaK показано ниже, полученный при этом набор записей немного отличается от того, который был получен при использовании предыдущих запросов.

(1 row(s) affected)



1 ... 24 25 26 [ 27 ] 28 29 30 ... 346

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика