Предложение GROUP BY

Предложение GROUP BY

Когда запрос включает предложение GROUP BY, TO спецификация столбца и таблицы, а именно:

SELECT {<список-столбцов>}

FROM <спецификация-таблицы>

[WHERE <условие-поиска>]

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

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

Его синтаксис:

SELECT <список-группируемых-полей> FROM <спецификация-таблицы>

[WHERE...]

GROUP BY <группирующий-элемент> [COLLATE последовательность-сортировки]

[, <группирующий-элемент> [. . ] ]

HAVING <предикат-группируемых-столбцов>

[ORDER BY .. .] ;

Список группируемых полей

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

* Столбец базы данных или неагрегатное выражение не могут быть указаны в списке столбцов, если они не указаны в предложении GROUP BY.

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

! ! !

ВНИМАНИЕ! В Firebird 1.0.x и InterBase требования к допустимости группирования являются менее ограничивающими. Группирующие запросы и клиентские вызовы хранимых процедур могут вызывать исключения, которые ранее не появлялись. Это давняя ошибка, о которой вы должны знать при миграции ваших старых приложений в Firebird версии 1.5 и выше.

. ! .

Агрегатные выражения

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

Агрегатными функциями являются SUMO, которая вычисляет итоги, MINO и MAXO, отыскивающие наименьшее и наибольшее значение соответственно, и AVGO, вычисляющая среднее значение. Функция COUNT() также ведет себя как агрегатная функция в группирующих запросах, возвращая счетчик строк для всех строк ниже контекста (уровня)группы.

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

Таблица PROJ_DEPT_BUDGET содержит строки пересечения проектов и отделов. Мы заинтересованы в отыскании итога по бюджетам, выделенным каждому проекту, независимо от отдела. Следующий список элементов, который рассматривался ранее в этом разделе, задает список полей из двух нужных нам элементов:

SELECT

PROJ_ID,

SUM(PROJECTED_BUDGET) AS TOTAL_BUDGET

FROM PROJ_DEPT_BUDGET

WHERE FISCAL_YEAR = 1994

GROUP BY PROJ_ID;

Эти две спецификации поля хороши в качестве группируемых элементов. Идентификатор отдела (DEPT_NO) не присутствует в списке, потому что список задает нужные нам по проекту итоги. Для получения этих итогов мы используем аргумент PROJ_ID В предложении GROUP BY.

С другой стороны, если мы хотим получить список бюджетов отделов, независимых от проектов, список полей должен включать DEPT_NO, чтобы он был аргументом в предложении GROUP BY:

SELECT

DEPT_NO,

SUM(PROJECTED_BUDGET) AS TOTAL_BUDGET

FROM PROJ_DEPT_BUDGET

WHERE FISCAL_YEAR = 1994

GROUP BY DEPT_NO;

Влияние NULL на агрегатные выражения

В агрегатных выражениях типа SUMO, AVG() и COUNT(<имя-столбца>) строки, содержащие NULL в соответствующем столбце, игнорируются. Функция AVG() создает числитель, суммируя все непустые значения, и знаменатель, подсчитывая строки, содержащие непустые значения.

! ! !

ПРИМЕЧАНИЕ. Если у вас есть столбцы, по которым вы собираетесь вычислять среднее значение, важно решить в процессе проектирования, как при вычислении среднего значения вы будете трактовать "пустые" экземпляры - как NULL (они будут исключены из вычисления) или как ноль. Вы можете реализовать нужное правило, используя значение по умолчанию или (лучше) триггер BEFORE INSERT[86].

. ! .

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

История Open Group

Из книги автора

История Open Group The Open Group (Открытая группа) была сформирована в 1996 году объединением организаций X/Open Company (основана в 1984 году) и Open Software Foundation (OSF, основан в 1988 году). Эта группа представляет собой международный консорциум производителей и потребителей из промышленности,


Создание файлов passwd и group

Из книги автора

Создание файлов passwd и group Для возможности входа в систему под учетной записью root и для распознавания оболочкой имени «root», необходимо создать соответствующие записи в файлах /etc/passwd и /etc/group.Для создания файла /etc/passwd, выполните:echo «root:x:0:0:root:/root:/bin/bash» > /etc/passwdПароль для root (


23.2.6 Group Membership

Из книги автора

23.2.6 Group Membership Формат сообщений многоадресных рассылок Group Membership (членство в группе) показан на рис. 23.4. Он был изменен относительно версии 4 для согласования с форматом ICMPv6. Поле Maximum Response Delay (максимальная задержка ответа) имеет ненулевое значение только в сообщениях


Алексей Басов (Begun.ru, Finam.ru, Mail.Ru Group)

Из книги автора

Алексей Басов (Begun.ru, Finam.ru, Mail.Ru Group) Компания «Бегун» – первый российский сервис контекстной рекламы с платой за результат и аукционным ценообразованием. Компания работает на рынке с 2002 года. Среди партнеров – «Рамблер», Google, Mail.ru, «Афиша», Yahoo! ЖЖ, «Одноклассники» и многие


Убойное предложение

Из книги автора

Убойное предложение Первый элемент формулы – оффер (от англ. offer), или предложение. Ключ к написанию сильных предложений для интернет-магазина в том, чтобы давить на эмоции клиента, а не опираться на его логику. Ваше специальное предложение должно быть конкретным, четким и


Группировка записей. Предложение GROUP BY

Из книги автора

Группировка записей. Предложение GROUP BY Предложение GROUP BY используется для определения групп выходных строк, к которым могут применяться агрегатные функции (COUNT, MIN, MAX, AVG и SUM). Если это предложение отсутствует, и используются агрегатные функции, то все столбцы с именами,


The Open Group

Из книги автора

The Open Group The Open Group (Открытая группа) была сформирована в 1996 году объединением X/Open Company (основана в 1984 году) и Open Software Foundation (OSF, основан в 1988 году). Эта группа представляет собой международный консорциум производителей и потребителей из промышленности, правительства и


1.5.3. Предложение case в Ruby

Из книги автора

1.5.3. Предложение case в Ruby Во всех современных языках есть та или иная форма многопутевого ветвления. В C/C++ и Java это предложение switch, а в Pascal — предложение case. Служат они одной и той же цели и функционируют примерно одинаково.Предложение case в Ruby похоже, но при ближайшем


Элементы CheckBox, RadioButton и Group Box

Из книги автора

Элементы CheckBox, RadioButton и Group Box Пространство имен System.Windows.Forms определяет целый ряд других типов, расширяющих возможности ButtonBase, и это, в частности, тип CheckBox (кнопка с независимой фиксацией, может поддерживать до трех возможных состояний) и тип RadioButton (кнопка с зависимой


Совет 2 Предложение и спрос

Из книги автора

Совет 2 Предложение и спрос Когда интернет только начал входить в нашу жизнь, можно было хорошо заработать на создании простых HTML-страниц для фирм. Буквально каждый жаждал иметь собственную страничку, а вот создавать их умели немногие. Компании были готовы платить


2.1.5. Опции -group и -nogroup

Из книги автора

2.1.5. Опции -group и -nogroup Опции -group и -nogroup аналогичны опциям -user и -nouser и позволяют искать файлы, принадлежащие заданной группе или несуществующим группам. Ниже приведена команда для нахождения в каталоге /apps всех файлов, которыми владеют пользователи группы accts:$ find /apps -group accts


Mail.ru Group готовится к IPO Юрий Ильин

Из книги автора

Mail.ru Group готовится к IPO Юрий Ильин Опубликовано 11 октября 2010 года Компания Mail.ru Group Limited, до сентября 2010 г. называвшаяся Digital Sky Technologies, официально объявила о намерении провести первичное размещение акций (IPO) на Лондонской фондовой бирже (LSE) до конца 2010


Предложение indexing

Из книги автора

Предложение indexing В начале нашего класса помещено предложение, начинающееся с ключевого слова indexing. Оно содержит единственный пункт, помеченный как description. Предложение indexing не оказывает влияния на выполнение программ и служит для размещения информации, ассоциированной с