Группировка по значению функции

Вопрос: Возможно ли выполнить такой запрос:
SELECT F_YEAR(DATE), SUM(PRICE)
   ...
GROUP BY F_YEAR(DATE)

Ответ (Diane Brown): В соответствии с ANSI SQL92 в GROUP BY возможно использовать только имена существующих столбцов. IB придерживается этих правил. Другие производители, возможно, допускают такой синтаксис. Однако это является специфическим для производителя и, соответственно, непереносимым решением.

Комментарий от сентября 2005 года: Firebird 1.5 умеет выполнять группировку по функциям, выражениям или по номеру столбцам.

В IB подобную группировку можно реализовать следующими способами:
  • Добавить к таблице вычисляемое поле, и производить группировку по нему.
ALTER TABLE <tablename>
   ADD FYEAR COMPUTED BY (F_YEAR(DATE))
SELECT FYEAR, SUM(PRICE)
FROM  <tablename>
GROUP BY FYEAR
  • Добавить поле FYEAR к таблице и заполнять его как F_YEAR(DATE), используя триггер.
  • Создать представление (view) по таблице <tablename> и добавить столбец для FYEAR
CREATE VIEW <viewname> (this, that, ..., FYEAR)
   AS
      SELECT this, that, ..., F_YEAR(DATE)
      FROM <tablename>
SELECT ... FROM <viewname>
GROUP BY FYEAR
  • Создать селективную процедуру, которая будет возвращать столбцы таблицы и столбец FYEAR.

Каждый из перечисленных способов имеет преимущества и недостатки. Вам остается выбрать наиболее подходящий. 

Подпишитесь на новости Firebird в России

Подписаться