Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция SELECT.docx
Скачиваний:
6
Добавлен:
21.09.2019
Размер:
44.22 Кб
Скачать

Расчет значений вычисляемых столбцов

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

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

SELECT R.*, T.ZENA, R.KOLVO * T.ZENA FROM RASHOD R, TOVARY T WHERE R.TOVAR = T.TOVAR

Агрегатные функции

Агрегатные функции предназначены для вычисления итоговых значений операций над всеми записями НД. К агрегатным относятся следующие функции:

COUNT (<выражение>) - подсчитывает число вхождений значения выражения во все записи результирующего НД;

SUM(<выражение>)- суммирует значения выражения;

AVG(<выражение>)- находит среднее значение;

МАХ(<выражение>)- определяет максимальное значение;

МIN(<выражение>) - определяет минимальное значение.

Если из группы одинаковых записей нужно учитывать только одну, перед выра­жением в скобках включают слово DISTINCT:

COUNT(DISTINCT POKUP)

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

Пример. В следующем запросе подсчитывается количество покупателей, приобретавших товары на складе:

SELECT COUNT(DISTINCT POKUP) AS COUNT_POKUP FROM RASHOD

Пример. Вычислить общую стоимость отпущенных товаров за 10.01.97:

SELECT SUM(R.KOLVO * T.ZENA) AS OBS_ZENA FROM RASHOD R,TOVARY T WHERE (R.TOVAR=T.TOVAR) AND (R.DAT RASH="10-JAN-1997")

Группировка записей

Иногда требуется получить агрегированные значения (минимум, максимум, сред­нее) не по всему результирующему НД, а по каждой из входящих в него групп запи­сей, характеризующихся одинаковым значением какого-либо столбца. Например, вы­дать общее количество отпущенного товара по каждому товару. В этом случае в опе­ратор SELECT перед предложением WHERE вводится предложение

GROUP BY столбец [,столбец1...]

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

Пример.Вот как можно получить общее количество отпуска по каждому из товаров:

SELECT R.TOVAR, SUM(R.KOLVO) AS OTPUSK FROM RASHOD R GROUP BY R.TOVAR

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

SELECT R.TOVAR, SUM(R.KOLVO * T.ZENA) FROM RASHOD R, TOVARY T WHERE T.TOVAR = R.TOVAR GROUP BY R.TOVAR

Пример. Общая цена по каждому из отпущенных товаров на каждую дату:

SELECT R.TOVAR,R.DAT_RASH,SUM(R.KOLVO*T.ZENA) FROM RASHOD R, TOVARY T WHERE T.TOVAR=R.TOVAR GROUP BY R.TOVAR,R.DAT_RASH

Пример. Количество покупателей на каждую дату:

SELECT DAT_RASH, COUNT(DISTINCT POKUP) FROM RASHOD GROUP BY DAT_ RASH

ПРЕДЛОЖЕНИЕ HAVING - НАЛОЖЕНИЕ ОГРАНИЧЕНИЙ НА ГРУППИРОВКУ ЗАПИСЕЙ

Если нужно в результирующем НД выдавать агрегацию не по всем группам, а только по тем из них, которые отвечают некоторому условию, после предложения GROUP BY указывают предложение HAVING.

После НАVING указываются условия, которые отличаются от условий, определяемых в предложении WHERE, одним важным обстоятельством: в HAVING обязательно должна быть указана одна из агрегатных функций, в то время как в пред­ложении WHERE такие функции указывать нельзя.

Пример. Минимальные покупки товара в единицах для всех покупателей, у которых мини­мальное количество покупаемого товара не меньше 100 единиц:

SELECT POKUP, MIN(KOLVO)

FROM RASHOD

GROUP BY POKUP

HAVING MIN(KOLVO) >= 100

Если не указывать HAVING MIN(KOLVO)>=100 будут выданы все группы.

Пример. Количество фактов отпуска товаров на каждую дату, в которых отпускалось не ме­нее 1000 единиц товара:

SELECT DAT_RASH, COUNT(*) FROM RASHOD WHERE KOLVO >= 1000 GROUP BY DAT_RASH

Пример. Показать даты отпуска товаров, в которых количество отпускаемого товара было не меньше 1000 единиц. В результирующий НД включить только те группы, по кото­рым количество таких отпусков товаров больше 1:

SELECT DAT_RASH,COUNT(*) FROM RASHOD WHERE KOLVO>=1000 GROUP BY DAT_RASH HAVING COUNT(*)>1