Не делайте вложенных агрегатов

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

SELECT odate, MAX (SUM (amt))
FROM Orders
GROUP BY odate;

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

Резюме

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

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

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

Теперь, когда вы стали знатоком большого количества того, как запрос производит значения, мы покажем вам, в Главе 7, некоторые вещи которые вы можете делать со значениями, которые он производит.

Работа с SQL

1. Напишите запрос, который сосчитал бы все суммы приобретений на 3 Октября.

2. Напишите запрос, который сосчитал бы число различных, отличных от NULL значений поля city в таблице Заказчиков.

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

4. Напишите запрос, который бы выбирал заказчиков в алфавитном Заказе, чьи имена начинаются с буквы G.

5. Напишите запрос, который выбрал бы высшую оценку в каждом городе.

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

(См. Приложение A для ответов.)


Форматирование вывода запросов

ЭТА ГЛАВА РАСШИРИТ ВАШИ ВОЗМОЖНОСТИ в работе с выводом, который производит запрос. Вы узнаете, как вставлять текст и константы между выбранных полей, как использовать выбранные поля в математических выражениях, чьи результаты затем становятся выводом, и как сделать, чтобы ваши значения выводились в определенном порядке. Эта последняя особенность включена, чтобы упорядочивать ваш вывод по любым столбцам, любым полученным значениям этого столбца, или по обеим.

Строки и выражения

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