Запросы с группировкой
Иногда интерес будут представлять не каждая строка таблицы в отдельности, а итоговые значения по группам данных. Например, может понадобиться общая сумма продаж для клиентов, проживающих в определенном районе или интересно знать средний объем продаж по месяцам, чтобы выяснить тенденции сбыта. Получить ответы на такие вопросы можно с помощью итоговых запросов (запросов с группировкой). Оператор GROUP BY позволяет выделять группы в результирующем множестве записей. Группой являются записи с совпадающими значениями в полях, перечисленных за оператором GROUP BY. Оператор перегруппирует таблицу таким образом, чтобы в каждой группе все строки имели одно и тоже значение поля. Инструкция SELECT затем применяется уже к группам перекомпонованной таблицы. Каждое выражение во фразе SELECT должно принимать единственное значение для группы, т.е. оно может быть либо самим полем, либо арифметическим выражением, включающем это поле, либо константой, либо агрегатной функцией, возвращающей единственное значение для группы. В запросах с группировкой необходимо тщательно следить за включением полей во фразу SELECT, так как в противном случае можно не получить желаемого результата. Если во фразу SELECT будет помещено хотя бы одно поле, которое не является единственным для группы, например ключевое поле подчиненной таблицы, то создание групп будет прервано, так как в результате каждая строка запроса будет уникальна.
В результате запроса только с группировкой по некоторому полю получится таблица, содержащая по одной записи для каждой группы. Группирование записей само по себе ничего не дает. Обычно производятся вычисления для групп. Для этой цели имеется ряд групповых (иначе агрегатных) функций:
SUM – вычисляет сумму всех значений заданного поля в каждой группе;
AVG – вычисляет среднее арифметическое всех значений заданного поля в каждой группе;
STDEV – вычисляет стандартное отклонение всех значений заданного поля в каждой группе;
VAR – вычисляет дисперсию всех значений заданного поля в каждой группе;
COUNT – вычисляет число записей, для которых значение заданного поля отлично от NULL. Для подсчета всех записей необходимо использовать операцию *: Count(*);
MIN – возвращает минимальное значение заданного поля в каждой группе;
MAX – возвращает максимальное значение заданного поля в каждой группе;
FIRST – возвращает первое значение заданного поля в каждой группе;
LAST – возвращает последнее значение заданного поля в каждой группе;
Групповые функции могут применяться сами по себе, без выполнения группировки. Тогда группой будет считаться все отобранные оператором WHERE записи. Например, SELECT Count(*) FROM Заказы; – подсчитает все записи в таблице заказы:
SELECT Sum([Отпускная цена] + [Транс издержки]) As Полная_цена FROM Заказы WHERE Город = “Минск”; – подсчитает полную сумму цен по всем заказам, сделанным из Минска;
SELECT Клиенты.Фамилия, Sum(Заказы.Цена) AS Стоимость FROM Клиенты INNER JOIN Заказы ON Клиенты.КодКлиента = Заказы.КодКлиента WHERE Клиенты.Город ="Минск" GROUP BY Клиенты.Фамилия; – подсчитает полную сумму цен по всем заказам для каждого клиента, проживающим в Минске.
Оператор HAVING действует совместно с оператором GROUP BY и используется для дополнительной селекции записей во время определения групп. Он выполняет те же функции, что и WHERE, но уже в рамках выходного набора. Оператор HAVING устанавливает, какие записи, сгруппированные посредством GROUP BY, должны отображаться и участвовать в групповых операциях. Правила записи < условия отбора > аналогичны правилам формирования <условия отбора> оператора WHERE:
SELECT код_товара FROM Заказы GROUP BY код_товара HAVING Count(*) > 1; - отбирает коды товаров, покупаемых более чем одним покупателем.
Оператор ORDER BY задает порядок сортировки результирующего множества. Обычно он замыкает инструкцию SELECT. Каждая <спецификация> сортировки представляет собой пару вида: <имя поля> [ASC/DESC]. Большинство СУБД требуют, чтобы поле, участвующее в сортировке, присутствовало в выходном наборе:
SELECT Наименование FROM Товары ORDER BY Наименование;
Дата добавления: 2016-10-26; просмотров: 2905;