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

Використання фрази 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<#20/1/2002#

GROUP BY kod

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

Kod

Suma_tov

1

195

2

150

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

Фраза HAVING призначена для сумісного використання з фразою GROUP BY для обмеження відбору груп, які відбираються для результуючої таблиці запиту. Хоч фрази HAVING і WHERE мають схожий синтаксис, їх призначення різне. WHERE призначене для фільтрації рядків, які використовуються в тому числі для групування, фраза HAVING призначена для фільтрації груп, які заносяться в результуючу таблицю. На практиці предикат фрази HAVING повинен містить одну з агрегатних функцій. Наприклад, якщо потрібно дізнатись на яку суму закуплено кожного товару, причому сумарна вартість товару не первищувала б 200 грн.,необхідно сформувати такий запит:

SELECT kod,SUM(suma) AS suma_tov

FROM table_a

GROUP BY kod

HAVING SUM(suma)<=200

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

Kod

Suma_tov

1

195

3

28

Якщо потрібно сформувати список товарів (з включенням в результуючу таблицю коду товару, сумарну вартість цього товару і кількість покупок цього товару), середня вартість покупки товару перевищувала би 50, запит мав би вид:

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

FROM table_a

GROUP BY kod

HAVING AVG(suma)>50

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

Kod

Suma_tov

kilkist_pokupok

1

195

3

2

239

2

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

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

FROM table_a

WHERE data<#20/1/2002#

GROUP BY kod

HAVING AVG(suma)>50

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

Kod

Suma_tov

kilkist_pokupok

1

195

3

2

150

1

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