powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вычисление значения при вставке или обновлении
7 сообщений из 7, страница 1 из 1
Вычисление значения при вставке или обновлении
    #35665111
rainguy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица:
CREATE TABLE main
(
id serial NOT NULL,
data date DEFAULT now(),
in1 numeric(10,2) NOT NULL DEFAULT 0,
in2 numeric(10,2) NOT NULL DEFAULT 0,
out1 numeric(10,2) NOT NULL DEFAULT 0,
CONSTRAINT main_id_pkey PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE main OWNER TO postgres;
Нужно, чтобы при вставке или изминении in1, in2 пересчитывалось out1 которое разница сумм (sum(in1)-sum(in2)
МОжет подскажете где копать?
...
Рейтинг: 0 / 0
Вычисление значения при вставке или обновлении
    #35665522
eddie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не очень понятно, что вы хотите сделать.

sum(in1)-sum(in2) - это по какому набору данных? по всей таблице или по её части?
зачем в каждой строчке хранить данные по группе строк?
...
Рейтинг: 0 / 0
Вычисление значения при вставке или обновлении
    #35666757
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
CREATE VIEW main_out AS SELECT id, data, in1, in2, (in1 - in2) AS out;

жмак

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
Вычисление значения при вставке или обновлении
    #35666761
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон

Код: plaintext
CREATE VIEW main_out AS SELECT id, data, in1, in2, (in1 - in2) AS out FROM main;

Со всеми разговариваю уважительно, но недолго. На вопросы типа ...Как дела? ...не отвечаю, это флуд.
© Lister the Tormentor
...
Рейтинг: 0 / 0
Вычисление значения при вставке или обновлении
    #35667262
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ss25
Код: plaintext
CREATE VIEW main_out AS SELECT id, data, in1, in2, (in1 - in2) AS out FROM main;
это один из вариантов понимания вопроса. но не гарантированно правильный.

вдумаемтеся:
автор
Код: plaintext
(sum(in1)-sum(in2)

можно, например, предполагать, что автор таки хочет в поле out иметь разницу сумм по всей таблице на момент "data" (со всеми сопутствующими коллизиями по части "что нарастает внутри одной даты, и нарастает ли"). может - что-то еще. Т.ч. хотя вы, вероятно, и правильно догадались, но более точен был eddie .
...
Рейтинг: 0 / 0
Вычисление значения при вставке или обновлении
    #35669099
Фотография ss25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторможно, например, предполагать, что автор таки хочет в поле out иметь разницу сумм по всей таблице на момент "data" (со всеми сопутствующими коллизиями по части "что нарастает внутри одной даты, и нарастает ли"). может - что-то еще. Т.ч. хотя вы, вероятно, и правильно догадались, но более точен был eddie.

я ориентировался на таблицу приведенную rainguy
...
Рейтинг: 0 / 0
Вычисление значения при вставке или обновлении
    #35671144
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ss25я хотя вы, вероятно, и правильно догадались, но более точен был eddie.
я ориентировался на таблицу приведенную rainguy
перечитайте ответ eddie . он тоже ориентировался на ту же таблицу, но и на тз от того же автора, в котором черным по белому написано:
Код: plaintext
 сумм  ( sum (in1)- sum (in2)
.

в этой и именно этой структуре при некоторой любви к извращениям вполне можно вести накопительные разницы. В функции триггера делать например такое извращение:

Код: plaintext
1.
2.
3.
UPDATE main SET out1 = 
(SELECT  (sum(in1)-sum(in2)) FROM main m 
WHERE m.date<=maine.date)--out1 на конец дня или m.date<maine.date - на начало дня
WHERE maine.date >=NEW.date --можно закоментить, и делать триггер на стейтмент, а не на ряд

или инкрементально (чтобы не считать суммы по всей таблице

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
UPDATE main SET out1 = 
 out1  + (NEW.in1-NEW.in2)
- (OLD.in1-OLD.in2)

WHERE main.date>=NEW.date
AND main.date>=OLD.date;
/* и еще пара  веток на случай не совпадения дат NEW и OLD
WHERE main.date>=NEW.date
AND main.date<OLD.date;

WHERE main.date<NEW.date
AND main.date>=OLD.date;
*/
еще раз - это возможно извращение (особо с неинкрементальным расчетом сумм), но из постановки задачи не заметно, что оно автору не нужно
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вычисление значения при вставке или обновлении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]