Базы данных - модели, разработка, реализация



         

Применение агрегатных функций и вложенных запросов в операторе выбора - часть 5


Правильной командой будет следующая:

  • SELECT Филиал. SUM(Остаток)
  • FROM F
  • GROUP BY Филиал
  • HAVING SUM(Остаток) > 5000;
  • Аргументы в предложении HAVING подчиняются тем же самым правилам, что и в предложении SELECT, где используется GROUP BY. Они должны иметь одно значение на группу вывода.

    Следующая команда будет запрещена:

  • SELECT Филиал.SUM(Остаток)
  • FROM F
  • GROUP BY Филиал
  • HAVING Дата Открытия - 27/12/1999;
  • Поле Дата Открытия не может быть использовано в предложении HAVING, потому что оно может иметь больше чем одно значение на группу вывода. Чтобы избежать такой ситуации, предложение HAVING должно ссылаться только на агрегаты и поля, выбранные GROUP BY. Имеется правильный способ сделать вышеупомянутый запрос:

  • SELECT Филиал.SUM(Остаток)
  • FROM F
  • WHERE Дата Открытия = ?27/12/1999?
  • GROUP BY Филиал:
  • Смысл данного запроса следующий: найти сумму остатков по каждому филиалу счетов, открытых 27 декабря 1999 года.

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

  • SELECT Филиал. SUM(Остаток)
  • FROM F.Q
  • WHERE F.Филиал = Q.Филиал
  • GROUP BY Филиал
  • HAVING Филиал IN ("Санкт-Петербург". "Псков", "Урюпинск");
  • Поэтому в арифметических выражениях предикатов, входящих в условие выборки раздела HAVING, прямо можно использовать только спецификации столбцов,

    86

    указанных в качестве столбцов группирования в разделе GROUP BY. Остальные столбцы можно специфицировать только внутри спецификаций агрегатных функций COUNT, SUM, AVG, MIN и MAX, вычисляющих в данном случае некоторое агрегатное значение для всей группы строк. Аналогично обстоит дело с подзапросами, входящими в предикаты условия выборки раздела HAVING: если в подзапросе используется характеристика текущей группы, то она может задаваться только путем ссылки на столбцы группирования.

    Результатом выполнения раздела HAVING является сгруппированная таблица, содержащая только те группы строк, для которых результат вычисления условия поиска есть TRUE. В частности, если раздел HAVING присутствует в табличном выражении, не содержащем GROUP BY, то результатом его выполнения будет либо пустая таблица, либо результат выполнения предыдущих разделов табличного выражения, рассматриваемый как одна группа без столбцов группирования.

    87

    81 :: 82 :: 83 :: 84 :: 85 :: 86 :: 87 :: Содержание




    Содержание  Назад  Вперед