Как задать процент от значения столбца, а затем вставить это значение в столбец

#plsql #insert #oracle-sqldeveloper #percentage

#plsql #вставить #oracle-sqldeveloper #процент

Вопрос:

Приведенная ниже таблица должна быть результатом, которого я хочу достичь. Это означает, что в зависимости от того, какое значение находится в column1, которое является процентом, и какое значение находится в column2. column1 будет выполнять процент от column2. Например, 80% от 1000 = 800, которое будет изменено в столбце 2 2-й записи.

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

 Orginal 1st record->                        column1 column2  
                                            80      1000   

Inserted copy records which is 2nd record   column1 column2  
(what I want to achieved)                   80      800
  

Мои коды

ВСТАВИТЬ В table1 (column1, column2) ЗНАЧЕНИЯ (tran.column1, tran.column2);

Ответ №1:

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

 create table table1 (col1 integer, col2 integer, col3 as (col1 / 100 * col2));


SQL> insert into table1(col1,col2) values(80, 1000);

1 row created.

SQL> select * from table1;

      COL1       COL2       COL3
---------- ---------- ----------
        80       1000        800

SQL>
  

Преимущество в том, что вы сохраняете исходное значение, поэтому, если COL1 (процент) обновляется или вы меняете формулу, результаты пересчитываются.

В противном случае создайте триггер BEFORE INSERT ДЛЯ КАЖДОЙ СТРОКИ.

 CREATE OR REPLACE TRIGGER ins_table1
BEFORE INSERT ON table1 cFOR EACH ROW
BEGIN
   :NEW.col2 := :NEW.col1 / 100 * :NEW.col2;
END;
/
  

Комментарии:

1. Это было бы моим предпочтительным решением, если бы данных еще не было в таблице. Определенно путь вперед, но в вопросе не оговаривалось, что версия DB была 11gR1 или выше.

Ответ №2:

Если ваши данные уже существуют в таблице, вы можете просто обновить эту строку:

 UPDATE table1
SET column2 = column1 / 100 * column2
WHERE table1.id = ...
  

Я бы все же рекомендовал решение @mrjoltcola, если вы используете последнюю версию DB и можете изменить таблицу. Это гораздо более элегантно и позволяет вам видеть значения, на которых основаны ваши вычисления. Этот оператор UPDATE, если он выполняется более одного раза, приведет к потере значений column2 .

Комментарии:

1. Я отредактировал свой пост, чтобы сделать его более понятным. И нет, 2-я запись не существует в таблице, если я не использую свой код вставки. Так что это означает, что это не обновление. Я хочу вставить 2-ю запись, дублированную из 1-й записи, но будет изменено только значение column2 2-й записи. @Pete Mahon