Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_4.doc
Скачиваний:
2
Добавлен:
21.11.2019
Размер:
142.85 Кб
Скачать

Використання агрегатних функцій в підзапитах

Тип функцій, який автоматично може проводити поодиноке значення для будь-якого числа рядків, звичайно ж - агрегатна функція.

Будь-який запит, що використовує поодиноку функцію агрегату без пропозиції GROUP BY, вибиратиме поодиноке значення для використання в основному предикаті. Наприклад, ви хочете побачити усі замовлення, що мають суму вище середньою на 4-і жовтня (висновок показаний на Малюнку 10.3) :

SELECT *

FROM Orders

WHERE amt >

(SELECT AVG (amt)

FROM Orders

WHERE odate = 10/04/1990);

=============== SQL Execution Log ==============

| |

| SELECT * |

| FROM Orders |

| WHERE amt > |

| (SELECT AVG (amt) |

| FROM Orders |

| WHERE odate = 01/04/1990); |

| =============================================== |

| onum amt odate cnum snum |

| ----- -------- ---------- ----- ----- |

| 3002 1900.10 10/03/1990 2007 1004 |

| 3005 2345.45 10/03/1990 2003 1002 |

| 3006 1098.19 10/03/1990 2008 1007 |

| 3009 1713.23 10/04/1990 2002 1003 |

| 3008 4723.00 10/05/1990 2006 1001 |

| 3010 1309.95 10/06/1990 2004 1002 |

| 3011 9891.88 10/06/1990 2006 1001 |

================================================

Малюнок 10.3 Вибір усіх сум зі значенням вище за середній на 10/04/1990

Середня сума придбань на 4 жовтня - 1788.98 (1713.23 + 75.75) ділиться навпіл, що в цілому дорівнює 894.49. Усі рядки зі значенням в полі amt вище за це є вибраними. Майте на увазі, що згруповані агрегатні функції, які є агрегатними функціями, визначеними в термінах пропозиції GROUP BY, можуть проводити численні значення. Вони, отже, недопустимі в підзапитах такого характеру. Навіть якщо GROUP BY і HAVING використовуються у такий спосіб, що тільки одна група виводиться за допомогою підзапиту, команда буде відхилена в принципі. Ви повинні використовувати поодиноку агрегатну функцію з пропозицією WHERE, що усуне небажані групи.

Наприклад, наступний запит який повинен знайти середнє значення комісійних продавця в Лондоні

SELECT AVG (comm)

FROM Salespeople

GROUP BY city

HAVlNG city = "London";

не може використовуватися в підзапиті! В усякому разі, це не кращий спосіб формувати запит.

Іншим способом може бути

SELECT AVG (comm)

FROM Salespeople

WHERE city = "London";

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]