Программирование >>  Sql: полное руководство 

1 ... 55 56 57 [ 58 ] 59 60 61 ... 264


CUST

AMOUNT

2102

$3,978.00

,978.00

,978.00

,978.00

CDST

AMOUNT

102 10?

2106 2106

$2, $1,

,130.00 ,896.00

,026.00

CDST

AMOUNT

102 102

2114 2114

$15, $7,

,000.00 ,100.00

$22,

,100.00

CDST

AMOUNT

2120

,750.00

,750.00

$29,

876.00

975.20

Приведенный выше запрос генерирует обычные результаты, содержащие одну строку для каждой строки таблицы orders и отсортированные по столбцам rep и cuST. Кроме того, он вычисляет сумму заказов для каждой пары клиент/служаший (промежуточный итог нижнего уровня) и вычисляет сумму заказов и среднюю стоимость заказа для каждого служащего (промежуточный итог верхнего уровня). Таким образом, результаты запроса содержат смесь нормальньпс строк и итоговых строк двух уровней.

Предложение compute не вписывается ни в какие стандарты и, по сути, является специфической особенностью диалекта Transact-SQL в SQL Server. Более того, оно нарушает основные правила построения реляционных запросов, поскольку результаты



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

Ограничения на запросы с группировкой

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

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

константа;

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

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

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

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

Еще одно ограничение запросов с группировкой обусловлено тем, что в SQL игнорируется информация о первичных и внешних ключах при анализе правильности запроса с группировкой. Рассмотрим следующий запрос:

Подсчитать общее количество заказов для каждого служащего.

SELECT EMPL NUM, NAME, SDM(AMOUNT) FROM ORDERS, SALESREPS WHERE REP = EMPL NUM GROUP BY EMPL NDM

Error: NAME not a GROUP BY expression

Зная природу данных, можно сказать, что запрос правильный, поскольку группировка по идентификатору служащего - фактически то же самое, что и группировка по имени служащего. Говоря более точно, столбец группировки empl num является первичным ключом таблицы salesreps, поэтому столбец name должен иметь одно значение для каждой группы. Тем не менее, вьщается сообщение об ошибке, поскольку столбец name не указан в качестве столбца группировки. Чтобы решить эту проблему, необходимо просто включить этот столбец в предложение group by:

Подсчитать общее количество заказов для каждого служащего.

SELECT EMPL NUM, NAME, SUM(AMOUNT) FROM ORDERS, SALESREPS WHERE REP = EMPL NUM ,

GROUP BY EMPL NUM, NAME



NAME

SUM(AMOUNT)

Dan Roberts

$3,978,

Sue Smith

$29, 876,

Paul Cruz

$37,795,

Bob Smith

$22,500,

Bill Adams

$35, 582,

Sam Clark

$32,958,

Nancy Angelli

$3,082,

Larry Fitch

$51,467,

Mary Jones

$7,255

Tom Snyder

$23,132

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

/Подсчитать общее количество заказов для каждого служащего.

SELECT NAME, SUM(AMOUNT) FROM ORDERS, SALESREPS WHERE REP = EMPL NUM GROUP BY NAME

NAME

Bill Adams

$35, 582,

Bob Smith

$22,500,

Dan Roberts

$3,978,

Larry Fitch

$51,467,

, 00

Mary Jones

$7,255

Nancy Angelli

$3,082,

Paul Cruz

$37,795

Sam Clark

$32,958

Sue Smith

$29,876

Tom Snyder

$23,132

Значения NULL в столбцах группировки

Когда в столбце группировки содержится значение null, возникают дополнительные осложнения. Если значение столбца неизвестно, к какой группе его следует отнести? В предложении where при сравнении двух значений null результат имеет значение null (а не true), т.е. два значения null не считаются одинаковыми. Если такое соглашение применить в предложении group by, это приведет к тому, что каждая строка со значением null в столбце группировки будет помещена в отдельную группу, состоящую из одной этой строки.

На практике это правило очень неудобно. Поэтому в стандарте ANSI/ISO определено, что два значения null в предложении group by равны. Если две строки имеют значение null в одинаковых столбцах группировки и идентичные значения во всех остальных столбцах группировки, они помещаются в одну группу. Небольшая таблица на рис. 8.4 иллюстрирует принцип обработки значений null предложением group by в соответствии со стандартом ANSI/ISO, как показано в следующем запросе:

SELECT HAIR, EYES, COUNT(*) FROM PEOPLE



1 ... 55 56 57 [ 58 ] 59 60 61 ... 264

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