Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Авт_ПМП / Metod_BD.doc
Скачиваний:
31
Добавлен:
05.02.2016
Размер:
574.98 Кб
Скачать

Групування результатів (фраза group by). Агрегатні функції

Стандарт ISO містить визначення 5 агрегатних функцій:

COUNT

Повертає кількість значень у вказаному стовпчику

SUM

Повертає суму значень у вказаному стовпчику

AVG

Повертає середнє значення у вказаному стовпчику

MIN

Повертає мінімальне значення у вказаному стовпчику

MAX

Повертає максимальне значення у вказаному стовпчику

Всі ці функції оперують зі значеннями одного стовпчика і повертають єдине значення. Функції COUNT, MIN, MAX можуть застосовуватись як до числових стовпчиків, так і до нечислових, а функції SUM i AVG застосовують лише до числових стовпчиків. За виключенням COUNT(*), при обчисленні значення функцій значення NULL не враховуються. Варіант COUNT(*) є особливим випадком застосування функції COUNT. COUNT(*) повертає загальну кількість рядків результуючої таблиці, незалежно від того містяться там NULL-значення, дубльовані рядки або любі інші значення. Якщо до застосування агрегатних функцій необхідно виключити дубльовані значення, то потрібно перед іменем стовпчика, який є аргументом агрегатної функції помістити ключове слово DISTINCT, наприклад COUNT(DISTINCT kod). Слід зауважити, що не всі діалекти підтримують цю конструкцію. Скажімо Access не підтримує такого використання COUNT.

Стандарт ISO допускає використання ключового слова ALL (тобто всіх), що означає, що виключати дублі непотрібно. За змовчуванням, діє ALL.

Слід зауважити, що ключове слово DISTINCT в кожному запиті можна вказати не більше одного разу. Агрегатні функції можуть використовуватись тільки в списку фрази SELECT, або в складі HAVING. У всіх інших випадках використання агрегатних недопустимо. Якщо список у фразі SELECT є агрегатні функції і в тексті запиту відсутня фраза GROUP BY, тоді список у фразі SELECT не повинен містити назви стовпчиків. Наприклад, такий запит

SELECT kod, SUM(suma)

FROM table_a

є некоректним, оскільки назва стовпчика kod не повинна зустрічатись у списку фрази SELECT.

Приклади використання агрегатних функцій. Запит

SELECT COUNT(kod)

FROM table_a

Поверне число 6 – кількість рядків table_a. Запит

SELECT MAX(suma)

FROM table_a

поверне максимальне значення стовпчика suma – 150. Запит

SELECT MIN(suma) AS suma_min,AVG(suma) AS suma_avg

FROM table_a

поверне таку таблицю результату:

suma_min

suma_avg

28

77

де suma_min означає найменше значення стовпчика suma, а suma_avg середнє значення стовпчика suma таблиці table_a. Запит

SELECT MAX(suma),MIN(suma),AVG(suma)

FROM table_a

WHERE data<{d'2002-01-15'}

поверне, відповідно, максимальне, мінімальне і середнє значення стовпчика suma для покупок, які були здійснені до 15-01-2002 року. Це числа 150, 55 і 101,666666666667 відповідно.

Використання фрази group by

Наведені вище приклади підсумкових даних подібні підсумковим рядкам, які поміщаються в кінці звітів. Правда, досить часто у звітах вимагається формувати проміжні підсумки. Для цієї цілі в операторі SELECT вказується фраза GROUP BY. Стандарт ISO вимагає, щоб фрази SELECT і GROUP BY були тісно пов’язані між собою. При використанні в операторі SELECT фрази GROUP BY фраза SELECT повинна містити тільки такі типи елементів:

  • імена стовпчиків;

  • агрегатні функції;

  • константи;

  • вирази, що містять перечисленні вище елементи.

Всі імена стовпчиків, які перераховані в списку SELECT’у повинні бути присутніми і у фразі GROUP BY.

На конкретних прикладах пояснимо як потрібно користуватись групуванням. Нагадаємо, що в таблиці table_a міститься інформація про закупки товарів. Якщо уважно подивитись, в цій таблиці є по декілька рядків, у яких значення стовпчика kod (код товару) повторюється, наприклад 1 зустрічається 3 рази. Група рядків, у яких kod=1, матиме вид:

Kod

suma

data

1

100

1.1.2002

1

55

10.1.2002

1

40

15.1.2002

Якщо потрібно дізнатись на яку суму закуплено кожного товару, необхідно сформувати такий запит:

SELECT kod,SUM(suma) AS suma_tov

FROM table_a

GROUP BY kod

Результуюча таблиця цього запиту матиме вид:

Kod

Suma_tov

1

195

2

239

3

28

Отже, оператор SELECT поступає таким чином, спочатку формує групи по значеннях стовпчиків, які перелічені у фразі GROUP BY (в нашому випадку одне поле kod), потім для кожної групи виконує агрегатну функцію і результат заносить у результуючу таблицю. Якби потрібно було крім сум вказати і кількість покупок кожного товару, запит був би таким:

SELECT kod,SUM(suma) AS suma_tov, COUNT(kod) AS kilkist_pokupok

FROM table_a

GROUP BY kod

Результуюча таблиця цього запиту матиме вид:

Kod

Suma_tov

kilkist_pokupok

1

195

3

2

239

2

3

28

1

Якщо ж потрібно дізнатись на яку суму закуплено кожного товару до 20.1.2002року, необхідно сформувати такий запит:

SELECT kod,SUM(suma) AS suma_tov

FROM table_a

WHERE data<{d'2002-01-20'}

GROUP BY kod

Результуюча таблиця цього запиту матиме вид:

Kod

Suma_tov

1

195

2

150

Соседние файлы в папке Авт_ПМП