Я хочу написать хранимую процедуру, которая выполняет условный расчет для столбца.В идеале реализация SP должна быть независимой от БД - если это возможно.Если не базовая база данных - это PostgreSQL (v8.4), так что она имеет приоритет.
Запрашиваемые базовые таблицы выглядят так:
CREATE TABLE treatment_def ( id PRIMARY SERIAL KEY,
name VARCHAR(16) NOT NULL
);
CREATE TABLE foo_group_def ( id PRIMARY SERIAL KEY,
name VARCHAR(16) NOT NULL
);
CREATE TABLE foo ( id PRIMARY SERIAL KEY,
name VARCHAR(16) NOT NULL,
trtmt_id INT REFERENCES treatment_def(id) ON DELETE RESTRICT,
foo_grp_id INT REFERENCES foo_group_def(id) ON DELETE RESTRICT,
is_male BOOLEAN NOT NULL,
cost REAL NOT NULL
);
Я хочу написать SP, который возвращаетследующий набор результатов таблицы:
имя_обработки, имя_группы foo, averaged_cost
, где усредненная стоимость рассчитывается по-разному, в зависимости от того,флаг строки * is_male * установлен в true или false .
Для целей этого вопроса давайте предположим, что если для флага is_male установлено значение true, то усредненная стоимость рассчитывается как SUM значений стоимости для группировки, и еслидля флага is_male установлено значение false, тогда значение стоимости вычисляется как AVERAGE значений стоимости для группировки.
(очевидно) данные группируются по trmt_id, foo_grp_id (и is_male?).
У меня есть приблизительное представление о том, как писать SQL, если не было условного теста для флага is_male.Тем не менее, я мог бы с некоторой помощью написать SP, как определено выше.
Вот моя первая попытка:
CREATE TYPE FOO_RESULT AS (treatment_name VARCHAR(16), foo_group_name VARCHAR(64), averaged_cost DOUBLE);
// Outline plpgsql (Pseudo code)
CREATE FUNCTION somefunc() RETURNS SETOF FOO_RESULT AS $$
BEGIN
RETURN QUERY SELECT t.name treatment_name, g.name group_name, averaged_cost FROM foo f
INNER JOIN treatment_def t ON t.id = f.trtmt_id
INNER JOIN foo_group_def g ON g.id = f.foo_grp_id
GROUP BY f.trtmt_id, f.foo_grp_id;
END;
$$ LANGUAGE plpgsql;
Буду признателен за помощь в том, как правильно написать этот SP, чтобыреализовать условный расчет в столбце результатов