Предложение GROUP BY
Предложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминах другого поля, и применять функцию агрегата к подмножеству. Это дает вам возможность объединять поля и агрегатные функции в едином предложении SELECT. Например, вы хотите найти наибольшую сумму приобретений, полученную каждым продавцом. Вы можете сделать раздельный запрос для каждого из них, выбрав MAX (amt) из таблицы Заказов для каждого значения поля snum. GROUP BY, однако, позволит Вам поместить их все в одну команду: SELECT snum, MAX (amt) Вывод для этого запроса показывается в Рисунке 6.5. =============== SQL Execution Log ============== Рисунок 6.5. Нахождение максимальной суммы продажи у каждого продавца. GROUP BY применяет агрегатные функции независимо от серий групп, которые определяются с помощью значения поля в целом. В этом случае, каждая группа состоит из всех строк с тем же самым значением поля snum, и функция MAX применяется отдельно для каждой такой группы. Это значение поля, к которому применяется GROUP BY, имеет, по определению, только одно значение на группу вывода, также как это делает агрегатная функция. Результатом является совместимость, которая позволяет агрегатам и полям объединяться таким образом. Вы можете также использовать GROUP BY с многочисленными полями. Совершенствуя вышеупомянутый пример далее, предположим, что вы хотите увидеть наибольшую сумму приобретений получаемую каждым продавцом каждый день. Чтобы сделать это, вы должны сгруппировать таблицу Заказов по продавцам и датам, и применить функцию MAX к каждой такой группе, подобно этому:
SELECT snum, odate, MAX (amt) Вывод для этого запроса показывается в Рисунке 6.6. =============== SQL Execution Log ============== Рисунок 6.6. Нахождение наибольшей суммы приобретений на каждый день Конечно же, пустые группы, в дни, когда текущий продавец не имел Заказов, не будут показаны в выводе. Предложение HAVING Предположим, что в предыдущем примере, вы хотели бы увидеть только максимальную сумму приобретений, значение которой выше $3000.00. Вы не сможете использовать агрегатную функцию в предложении WHERE (если вы не используете подзапрос, описанный позже), потому что предикаты оцениваются в терминах одиночной строки, а агрегатные функции оцениваются в терминах группы строк. Это означает, что вы не сможете сделать что-нибудь подобно следующему: SELECT snum, odate, MAX (amt) Это будет отклонением от строгой интерпретации ANSI. Чтобы увидеть максимальную стоимость приобретений свыше $3000.00, вы можете использовать предложение HAVING. Предложение HAVING определяет критерии, используемые чтобы удалять определенные группы из вывода, точно также как предложение WHERE делает это для индивидуальных строк. Правильной командой будет следующая: SELECT snum, odate, MAX (amt) Вывод для этого запроса показывается в Рисунке 6.7. =============== SQL Execution Log ============== Рисунок 6.7. Удаление групп агрегатных значений Аргументы в предложении HAVING следуют тем же самым правилам, что и в предложении SELECT, состоящем из команд использующих GROUP BY. Они должны иметь одно значение на группу вывода. Следующая команда будет запрещена:
SELECT snum, MAX (amt) Поле оdate не может быть вызвано предложением HAVING, потому что оно может иметь (и действительно имеет) больше чем одно значение на группу вывода. Чтобы избегать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос: SELECT snum, MAX (amt) // для Interbase: WHERE odate = CAST('10/03/1988' AS DATE)
Вывод показывается в Рисунке 6.8. =============== SQL Execution Log ============== Рисунок 6.8: Максимальное значение суммы приобретений у каждого продавца на 3 Октября. Поскольку поля odate нет, не может быть и выбранных полей, значение этих данных меньше, чем в некоторых других примерах. Вывод должен, вероятно, включать что-нибудь такое, что говорит: "это — самые большие Заказы на 3 Октября". В Главе 7, мы покажем, как вставлять текст в ваш вывод. Как и говорилось ранее, HAVING может использовать только аргументы, которые имеют одно значение на группу вывода. Практически, ссылки на агрегатные функции — наиболее общие, но и поля выбранные с помощью GROUP BY также допустимы. Например, мы хотим увидеть наибольшие Заказы для Serres и Rifkin: SELECT snum, MAX (amt) Вывод для этого запроса показывается в Рисунке 6.9. =============== SQL Execution Log ============== Рисунок 6.9. Использование HAVING с полями GROUP BY.
Читайте также: IV. Переведите предложение с обособленным причастным оборотом, подчеркните Partizip I или Partizip II. Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|