Программирование >>  Руководство по sql 

1 ... 37 38 39 [ 40 ] 41 42 43 ... 105


Синтаксис предложения GROUP BY

в контексте оператора SELECT предложение GROUP BY имеет следующи11 вид:

SELECT список выбора FROM список таблиц

[WHERE условия]

[GROUP BY список группировки]

[ORDER by список порядка]

В большинстве диалектов SQL каждый элемент из списка GROUP BY должен обязательно присутствовать в списке выбора - другими словами, группировать можно только выбираемые элементы. Разные системы, кроме имен столбцов, позволяют использовать в списке фуппировки выражения, заголовки столбцов и их порядковые номера в списке выбора. Некоторые возможные варианты приведены в Приложении Б. Кроме того, уточните соответствующие детали в руководстве по своей конкретной системе. Ниже приводится пример, в котором фуппировка выполняется по одному столбцу:

SQL:

select pub id, count(type) from titles group by pub id

Результат: pub id

оУзб ~ ~ 6

0877 5

1389 6

В список выбора включается столбец, по которому выполняется фуппировка и афегирующая функция. Все сфоки из первой фуппы имеют значение 0736 в столбце pubid, из второй фуппы - 0877, из фетьей - 1389. Функция COUNT вычисляет для каждой фуппы соответствующее ей единственное значение.

Группировка внутри групп. Путем сортировки одновременно по нескольким элементам можно создавать группы внуфи фупп. Разделяя элементы, по которым будет проводиться фуппировка, с помощью запятых можно разбить большие фуппы на подфуппы.

SQL:

select pub id, type, count(type)

from titles

group by pub id, type

Результат:

pub id

type

о7з1

business

0736

psychology

0877

NULL

0877

mod cook

0877

trad cook

1389

business

1389

popular comp

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



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

Ограничения. Несмотря на простой синтаксис, предложение GROUP BY часто является источником головной боли пользователей SQL.

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

SQL (вариант):

select pub id, type, count(type) from titles group by pub id

Так как таблица разделяется на наборы по издателям (group by pub id), результат запроса должен состоять не более чем из трех строк, и каждый элемент из списка выбора должен иметь по одному значению для набора. Однако у издателей имеются книги нескольких типов, и поэтому в больщинстве систем этот запрос не пройдет. Рещить эту проблему можно, добавив в предложение GROUP BY столбец type, как в предьщущем примере.

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

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

SQL:

select pub id, count(title id), type, count(title id)

from titles

group by pub id, type

Однако результат свидетельствует об обратном:

Результат:

pub id

type

0736

business

0736

psychology

0877

NULL

0877

mod cook

0877

trad cook

1389

business

1389

popular comp

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

SQL:

select pub id, count(title id) from titles group by pub id



Из результатов первого запроса становится ясно, что каждый издатель выпустил по шесть книг.

Результат: pub id

~о7зб~ б

0877 6

1389 6

Во втором запросе находится общее количество книг для каждой комбинации издатель/тип.

SQL:

select pub id, type, count(title id)

from titles

group by pub id, type

Результат:

pub id type

0736 business 1

0736 psychology 5

0877 NULL 1

0877 mod cook 2

0877 trad cook 3

1389 business 3

1389 popular comp 3

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

SQL:

select type, count(title id) from titles group by type

Результат:

Jtyp e

NULL 1

business 4

mod cook 2

popular comp 3

psychology 5

trad cook 3

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

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

Sybase SQL Server предоставляет для решения этой задачи специальное расширение. Ниже приводится соответствующий пример:



1 ... 37 38 39 [ 40 ] 41 42 43 ... 105

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