Программирование >>  Исключение дубликатов строк 

1 ... 140 141 142 [ 143 ] 144 145 146 ... 152


существует строк для конкретной категории предмета. От запроса требуется рассматривать категории предмета по одной. Будем выполнять подсчет строк категорий, а не строк, содержащих сведения о преподавателях. Рассмотрим следующий оператор Select:

SQL SELECT COUNT(Faculty.StaffID)

AS BiologyProfessor FROM (Faculty

INNER JOIN Faculty.Categories

ON Faculty.StaffID = Faculty.Categories.StaffID)

INNER JOIN Categories

ON Caregories.CategorylD =

Faculty CategoTies.CategorylD WHERE Categories.CategoryDescription = Biology AND Faculty.Title = Professor


Этот запрос сохранен в учебной базе данных как Count Of Biology Professors. Как можно видеть, на самом деле в примере базы данных расписания нет профессора, имеющего докторскую степень и преподающего биологию. От запроса требовалось рассмотреть только одну категории предмета. Поскольку отсутствуют строки, имеющие как профессора, так и биологию, то вполне законно получено пустое множество. Поэтому функция COUNT возвращает ноль.

Теперь можно вложить этот запрос как подзапрос в условие WHERE, которое извлекает совпадения по идентификатору категории из внешнего запроса. Это заставляет запрос рассматривать категории по одной, по мере извлечения одной строки с описанием категории из таблицы Категории во внешнем запросе. SQL будет следующий:

SELECT Categories.CategoryDescription, (SELECT COUNT(Faculty.StaffID) FROM (Faculty

INNER JOIN FacultyCategories

ON Faculty.StaffID = FacultyCategories.StaffID)

INNER JOIN Categories AS C2

ON C2.CategorylD = FacultyCategories.CategorylD

WHERE C2.CategorylD = Categories.CategorylD

AND Faculty.Title = Professor)

AS ProfCount FROM Categories WHERE

(SELECT COUNT(Faculty.StaffID) FROM (Faculty



INNER JOIN Faculty.Categories

ON Faculty.StaffID = Faculty Categories.StaffID)

INNER.JOIN Categories AS C3 ON C3.CategorylD = Faculty Categories.CategorylD WHERE C3.CategorylD = Categories.CategorylD AND Faculty.Title = Professor) < 3

Этот запрос сохранен в учебной БД как Subjects Fewer 3 Professors RIGHT. В условие SELECT также включена копия подзапроса, чтобы можно было видеть реальные количества по категориям. В этот раз все работает правильно, потому что подзапрос в условии WHERE

с полным правом возвращает ноль для категории, в которой нет профессоров с докторской степенью. Правильный результат приведен справа.

Как можно видеть, многие категории предметов в действительности не имеют профес-

Subjccts Feujcr 3 Professors RIGHT


\ccoiiiiting




Sin ess


Cicniistrv

С Д )m pi i t с r 10 ii 5 гm a t к> n S >st em s

Co m p It t er Science

Economics

И.;<*:iri!.rм.S{i>Ц.rrtVмrf.;AжWк{ .;v...ьдJ*v<i№

Geograpliy

Hisiorv

О urn all SOI


copoB с докторской степенью, назначенных для преподавания этого предмета. Хотя это окончательное решение вообще не использует HAVING, оно было включено, чтобы вы осознали, что HAVING - не всегда явное решение для задач подобного типа. HAVING можно использовать для решения запросов вида ...имеют меньше, чем... . Например, если нужно увидеть всех клиентов, затративших менее 500 долларов в прошлый месяц, но не интересуют клиенты, которые вообще ничего не покупали,то решение с использованием HAVING работает просто прекрасно (и, скорее

всего, будет выполняться быстрее). Однако если необходимо увидеть клиентов, которые ничего не покупали, нужно использовать метод без HAVING, который был только что представлен.

Phvsics

l\>litical Science

l*sychoIog\

[ reiicTi

(тегшап



Использование HAVING

На данный момент вы должны хорошо понимать, как запрашивать подсуммы для групп, используя агрегатные функции и условие GROUP BY, и как отфильтровать сгруппированные данные, используя HAVING. Самый лучший способ проиллюстрировать диапазон применения HAVING - это показать задачи, которые можно решать, используя это новое условие.

Показать каждого поставщика и среднее для него количество дней доставки товара, которое больше среднего количества дней доставки для всех поставщиков .

Вывести на экран для каоюдого товара наименование товара и общее количество продаою, которое больше, чем среднее количество продаж для всех товаров этой категории .

Привести список всех клиентов и даты их заказов, полное имя клиента и общую стоимость заказанных позиций, которая больше 1000 долларов ,

Сколько имеется заказов только на один товар?

Какие агенты сделали заявки более чем на 3000 долларов в декабре 1999 г.?

Показать эстрадных артистов, у которых имеется более двух перекрывающихся заявок .

Показать имя каоюдого агента, сумму цен контрактов

для забронированных ангажементов и общую сумму комиссионных

для агентов, у которых эта сумма превышает 1000 долларов .

Имеют ли какие-либо капитаны команд предварительное количество очков выше, чем у любого другого участника команды?

Отобразить на экране дисплея для каждого игрока в боулинг имя игрока и среднее количество очков за игру для игроков, среднее количество очков которых больше 155 .

Привести список игроков в боулинг, у которых наибольшее среднее предварительное количество очков по крайней мере на 20 кеглей больше, чем их текущее среднее значение .

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

Вывести на экран дисплея для каоюдой категории наименование категории и число курсов лекций, предлооюенных для тех категорий, которые имеют три и более курсов лекций .



1 ... 140 141 142 [ 143 ] 144 145 146 ... 152

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.071
При копировании материалов приветствуются ссылки.
Яндекс.Метрика