Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
Пишу на 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; Но в этом коде, как я понимаю, не работает ни присвоение месяца, соответственно потом и выборка не присвается. Ну и как итог, новое значение не пишется. Так как ошибка. Как правильно подставлять значение в название столбцов?(так сказать вычислять их) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 01:39 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
amnesia, не очень понял задачу. но если правильно понял то речь идёт о том как в тригере заменить значение вставляемого поля. если так то делаем присваивание NEW.field := (NEW.some_field1 + NEW.some_field2) * some_constant; ну и возвращаем NEW. если RETURN NULL то вставка / изменение не происходит (типа ролбэк). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 09:20 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
Нет, имею ввиду другое.. Есть таблица: 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 строк в запросе), но хочется универсально и коротко.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 10:44 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 11:29 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
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(Новую стоимость приплюсовать к старому значению в этой ячейке). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 11:48 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
amnesia, 1. Если хочется чего-то, что нельзя сделать простым способом — значит, хочется странного 2. Если хочется странного — значит, скорее всего вы что-то делаете неправильно 3. Как-то так: Код: plsql 1. или, если используется postgresql 9.1+ Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 12:26 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
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 команду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 14:24 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2016, 12:51 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat, C такой структурой, которую вы предлагаете, таблица увеличиться на 12 строк на 1 userid и на 1 type. Соответственно, если будет 3 типа, то это уже не 3 строки, а 36. А если 2 или 3 userid, то 72 или 108, вместо 6 и 9((, да ряды будут шире, но таблица уже и читабильней. Если зайти в саму базу. Знатоки подскажите, как лучше больше столбцов или строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2016, 00:29 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
amnesia, Почему на 12 сразу ? По строке каждый месяц всего-то. Вы когда над структурой думаете, сразу же прикидывайте какие запросы будете писать и как они "ложаться" на структуру. Если (как изначально) нужно сильно изгаляться, то стоит пересмотреть структуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2016, 01:31 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
amnesia, посмотрите в сторону Код: sql 1. 2. 3. 4. 5. 6. Ростущий итог если будет группировка по дням Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2016, 09:57 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
amnesia, Поддерживаю предыдущих ораторов LeXa NalBat, vyegorov. авторПричина ваших трудностей в неправильной структуре таблицы. Код: plsql 1. 2. 3. 4. не что иное, как повторяющаяся группа. RTFM "нормализация", "нормальные формы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 15:15 |
|
||
|
INSERT в столбец, который вычисляется из значений запроса
|
|||
|---|---|---|---|
|
#18+
d3a, Тут я бы рассматривал схему таблицы вместе с предполагаемым использованием. В данном случае удобнее будет иметь одну запись на месяц. В других случаях — скажем, EAV-модель или же хранение полей ISO-8583 пакета (карточные авторизации) — часто предпочтительней иметь значения в колонках, удобнее писать запросы и индексировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2016, 15:57 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39322535&tid=1996816]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
24ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 137ms |

| 0 / 0 |
