Программирование >>  Построение запросов sql 

1 ... 32 33 34 [ 35 ] 36 37 38 ... 101


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

SELECT (Начало счета

SUBSTRING(AccountCD FROM 1 FOR 3)) AS Acc 3,

COUNT(*) FROM Abonent

GROUP BY Acc 3;.

Результат выполнения запроса представлен на рис. 3.58.

ACC 3

COUNT

Начало счета 005

Начало счета 015

Начало счета 080

Начало счета 115

Начало счета 126

Начало счета 136

Начало счета 443

Рис. 3.58. Результат выполнения запроса с группировкой по выражению

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

Например, в результате попытки выполнить следующий запрос: SELECT AccountCD, COUNT(*)

FROM Abonent GROUP BY

SUBSTRING (AccountCD FROM 1 FOR 3);

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

Рассмотрим пример использования операции CASE в качестве элемента группировки. Например, требуется вывести средние значения начислений за годы до 2000 года и за годы после 1999 года. Соответсвующий запрос будет выглядеть следующим образом:

SELECT В среднем начислено

(CASE WHEN NachislYear < 2000 THEN до 2000 года ELSE после 1999 года

END) AS God,

AVG (NachislSum) AS average sum FROM NachislSumma



GROUP BY God;.

Результат выполнения запроса представлен на рис. 3.59.

AVERAGE SUM

В среднем начислено до 2000 года

30,40

В среднем начислено после 1999 года

58,24

Рис. 3.59. Результат выполнения запроса с группировкой по CASE

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

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

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

- константа;

- агрегатная функция, возвращающая одно значение для всех строк, входящих в группу;

- элемент группировки, который по определению имеет одно и то же значение во всех строках группы;

- функция, которая используется в качестве элемента группировки;

- выражение, включающее в себя перечисленные выше элементы.

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

3.2.6. Предложение HAVING

Предложение HAVING запроса SELECT применяется для наложения условий на строки, возвращаемые при использовании предложения GROUP BY. Оно состоит из ключевого слова HAVING, за которым следует <условие поиска>:

<условие поиска> [NOT] <условие поиска1>

[ANDOR][NOT] <условие поиска2>],

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



поиска, рассмотренным выше для предложения WHERE. Однако в качестве значения часто используется значение, возвращаемое агрегатными функциями.

Результат совместной работы HAVING с GROUP BY аналогичен результату работы запроса SELECT с предложением WHERE с той разницей, что HAVING выполняет те же функции над строками (группами) возвращаемого набора данных, а не над строками исходной таблицы. Из этого следует, что предложение HAVING начинает свою работу после того, как предложение GROUP BY разделит базовую таблицу на группы. В противоположность этому использование предложения WHERE приводит к тому, что сначала отбираются строки из базовой таблицы и только после этого отобранные строки начинают использоваться.

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

SELECT AccountCD, COUNT(*), MIN(Incomingdate)

FROM Request

GROUP BY AccountCD HAVING COUNT(*) > 1;.

Результат запроса представлен на рис. 3.60.

ACCOUNTCD

COUNT

005488

04.04.1999

080047

20.10.1998

080270

17.12.2001

115705

28.12.1999

136160

12.01.1999

136169

07.05.2001

443069

08.08.2001

Рис. 3.60. Результат выполнения запроса с HAVING

Работа этого запроса заключается в следующем. Вначале GROUP BY из таблицы Request формирует группы, состоящие из одинаковых значений поля AccountCD. После этого в предложении HAVING происходит подсчет числа строк, входящих в каждую группу, и в ТРЗ включаются все группы, которые содержат более одной строки.

Следует отметить, что если задать условие COUNT(*)>1 в предложении WHERE, то такой запрос потерпит неудачу, так как предложение WHERE производит оценку в терминах одиночной строки, а агрегатные функции оцениваются в терминах групп строк. В то же время из этого не следует, что предложение WHERE не используется с предложением HAVING.

Следует учесть, что предложение HAVING должно ссылаться только на агрегатные функции и элементы, выбранные GROUP BY.

Например, следующий запрос потерпит неудачу:

SELECT AccountCD, MAX(Incomingdate) FROM Request GROUP BY AccountCD



1 ... 32 33 34 [ 35 ] 36 37 38 ... 101

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