powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT в столбец, который вычисляется из значений запроса
13 сообщений из 13, страница 1 из 1
INSERT в столбец, который вычисляется из значений запроса
    #39322357
amnesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу на Python Django приложение и параллельно изучаю PostgreSQL
Создал таблицу в которой 16 полей из них 12 - это название месяцев на английском.
Уже 4 час бьюсь, мануал читаю, английские форумы листаю, нигде похожей проблемы не нашел.
В краце ситуация следующая: приходит информация в базу с датой и итоговой стоимостью и прочими 4 полями, с которыми проблем нет.
1)Необходимо вычленить название месяца из даты. Это сделал to_char(NEW.sell_cart_date, 'fmmonth'), чтобы указать как-то, что будем менять столбец с этим названием месяца в таблице при совпадении других полей(с которым как раз проблем нет).
2)Записать в столбец с названием полученного месяца информацию, путем отнимания старого значения стоимости и прибавлением нового(это если апдейт к примеру пришел, а не инсерт).
Наваял такой код, но он не работает из-за косяков с автоподстановкой месяца в названии столбца:

DECLARE
months varchar;
oldmonth varchar;
monthprice integer;
BEGIN
months = to_char(NEW.sell_cart_date, 'fmmonth');
oldmonth = to_char(OLD.sell_cart_date, 'fmmonth');
monthprice = select months from month_salesman where userid = NEW.sell_cart_seller_id AND year = EXTRACT(YEAR FROM NEW.sell_cart_date) AND type = 'tabako';
IF (TG_OP = 'UPDATE') THEN
UPDATE month_salesman SET month_salesman.months = monthprice + NEW.sell_cart_price_tabako - OLD.sell_cart_price_tabako WHERE userid = NEW.sell_cart_seller_id AND year = EXTRACT(YEAR FROM NEW.sell_cart_date) AND type = 'tabako';
END IF;
RETURN NULL;
END;

Но в этом коде, как я понимаю, не работает ни присвоение месяца, соответственно потом и выборка не присвается. Ну и как итог, новое значение не пишется. Так как ошибка.

Как правильно подставлять значение в название столбцов?(так сказать вычислять их)
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39322463
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amnesia,

не очень понял задачу. но если правильно понял то речь идёт о том как в тригере заменить значение вставляемого поля. если так то делаем присваивание NEW.field := (NEW.some_field1 + NEW.some_field2) * some_constant; ну и возвращаем NEW. если RETURN NULL то вставка / изменение не происходит (типа ролбэк).
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39322535
amnesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, имею ввиду другое..
Есть таблица:
CREATE TABLE month_salesman
(
id serial NOT NULL,
userid integer NOT NULL,
year integer NOT NULL,
type character varying(15) NOT NULL,
january integer,
february integer,
march integer,
april integer,
may integer,
june integer,
july integer,
august integer,
september integer,
october integer,
november integer,
december integer,
CONSTRAINT month_salesman_pkey PRIMARY KEY (id)
)
Пришел UPDATE в базу(ну или инсерт не важно, главное понять как обращаться с полями).
Чтобы как-то понять логику приложения, рассказываю:
Есть корзина, есть покупки в ней. Необходимо сохранить в эту таблицу(month_salesman) итоговую стоимость всей корзины, для этого мы смотрим ее дату(корзины), преобразуем ее в месяц, ищем столбец в таблице (month_salesman) с таким же месяцем и сохраняем в ячейку при условии что
userid integer NOT NULL,
year integer NOT NULL,
type character varying(15) NOT NULL
Как мне SQL выяснить в какую ячейку писать на основе запроса? Я выше написал, мои задумки и идеи по этому поводу, но если было бы все так просто уже бы работало.
Есть конечно решение для чайников, с помощью IF перечислить все месяцы(ячейки) сравнить значение с запросом(Но это + 20-30 строк в запросе), но хочется универсально и коротко..
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39322578
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
update table
set sum01 = case when вычесленный месяц = 1 then ваше_подставляемое_значение else  sum01 end,
set sum02 = case when вычесленный месяц = 2 then ваше_подставляемое_значение else  sum02 end,
...
set sum12 = case when вычесленный месяц = 12 then ваше_подставляемое_значение else  sum12 end

...
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39322599
amnesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Legushka, спасибо за совет. Но все опять сводиться по сути к перебору месяцев. Неужули нет такой конструкции, сейчас на словах объясню:
Присваиваем временной переменой в функции(тригера) значение пришедшего поля.
Month = to_char(NEW.sell_cart_date, 'fmmonth'); - Конструкция работает возвращает сейчас к примеру october.
Найти в таблице значение колонки month_salesman.month(Вот здесь мы не указываем явно october, а подставляем значение полученное выше, здесь вот у меня как раз ошибка, он пишет Month не существует) при (WHERE и т.п.)некоторых условиях значений других колонок, и после присвоить ячейке month_salesman.month = month_salesman.month + NEW.sell_cart_price_tabako(Новую стоимость приплюсовать к старому значению в этой ячейке).
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39322665
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
amnesia,
1. Если хочется чего-то, что нельзя сделать простым способом — значит, хочется странного
2. Если хочется странного — значит, скорее всего вы что-то делаете неправильно
3. Как-то так:
Код: plsql
1.
execute 'update month_salesman set '||months||'='||months||'+$1 ......' using NEW.sell_cart_price_tabako;


или, если используется postgresql 9.1+
Код: plsql
1.
execute format('update month_salesman set %I=%I+$1 ......', months, months) using NEW.sell_cart_price_tabako;
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39322813
amnesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vsl, спасибо!
То что нужно.
Кому вдруг пригодиться, итог такой
EXECUTE format('update month_salesman set %I=%I+$1.sell_cart_price_tabako WHERE userid = $1.sell_cart_seller_id AND year = EXTRACT(YEAR FROM $1.sell_cart_date) and types = 1', months, months) using NEW;

Как и хотел, все уместилось в 1 команду.
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39330536
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amnesiaCREATE TABLE month_salesman
(
id serial NOT NULL,
userid integer NOT NULL,
year integer NOT NULL,
type character varying(15) NOT NULL,
january integer,
february integer,
march integer,
april integer,
may integer,
june integer,
july integer,
august integer,
september integer,
october integer,
november integer,
december integer,
CONSTRAINT month_salesman_pkey PRIMARY KEY (id)
)
Причина ваших трудностей в неправильной структуре таблицы. Её строка должна содержать данные для одного человека за один месяц.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE month_salesman
(
  id serial NOT NULL,
  userid integer NOT NULL,
  year integer NOT NULL,
  month integer NOT NULL,
  type character varying(15) NOT NULL,
  value integer,
  CONSTRAINT month_salesman_pkey PRIMARY KEY (id)
)
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39362196
amnesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,
C такой структурой, которую вы предлагаете, таблица увеличиться на 12 строк на 1 userid и на 1 type.
Соответственно, если будет 3 типа, то это уже не 3 строки, а 36. А если 2 или 3 userid, то 72 или 108, вместо 6 и 9((, да ряды будут шире, но таблица уже и читабильней. Если зайти в саму базу.
Знатоки подскажите, как лучше больше столбцов или строк?
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39362204
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amnesia,

Почему на 12 сразу ? По строке каждый месяц всего-то.

Вы когда над структурой думаете, сразу же прикидывайте какие запросы будете писать и как они "ложаться" на структуру.
Если (как изначально) нужно сильно изгаляться, то стоит пересмотреть структуру.
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39362279
Zenden1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amnesia,
посмотрите в сторону
Код: sql
1.
2.
3.
4.
5.
6.
SELECT
месяц,
sum(поле) over (PARTITION BY месяц ORDER BY месяц) as "по месяцу"
FROM
таблица
GROUP BY месяц



Ростущий итог если будет группировка по дням

Код: sql
1.
2.
3.
4.
5.
6.
LAST_VALUE(CASE WHEN 
   сумма месяца=0 THEN NULL
							 ELSE сумма месяца
						END 
						IGNORE NULLS)
	OVER (PARTITION BY день или месяц ORDER BY день или месяц) as "растущий итог"
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39365799
d3a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amnesia,

Поддерживаю предыдущих ораторов LeXa NalBat, vyegorov.
авторПричина ваших трудностей в неправильной структуре таблицы.
Код: plsql
1.
2.
3.
4.
january integer,
february integer,
...
december integer,

не что иное, как повторяющаяся группа. RTFM "нормализация", "нормальные формы".
...
Рейтинг: 0 / 0
INSERT в столбец, который вычисляется из значений запроса
    #39365867
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d3a,

Тут я бы рассматривал схему таблицы вместе с предполагаемым использованием.
В данном случае удобнее будет иметь одну запись на месяц.

В других случаях — скажем, EAV-модель или же хранение полей ISO-8583 пакета (карточные авторизации) — часто предпочтительней иметь значения в колонках, удобнее писать запросы и индексировать.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT в столбец, который вычисляется из значений запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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