【问题标题】:How to do a percentage of a column value, and then insert that value into a column如何做一个列值的百分比,然后将该值插入到列中
【发布时间】:2014-07-01 12:30:42
【问题描述】:

下表应该是我想要实现的输出。这意味着取决于 column1 中的值是百分比,column2 中的值是什么。 column1 将执行 column2 的百分比。比如 1000 的 80% = 800,这将在第 2 条记录的第 2 列中更改。

目前我的代码只能选择当前记录并插入另一个副本,该副本将复制同一条记录。但现在我需要根据百分比计算和覆盖第 2 列的值。我没有把我的选择代码放在这里,因为我害怕你们都会感到困惑。我只把我的插入代码放在这里,请告诉我如何在代码中为column2的百分比做公式谢谢。

Orginal 1st record->                        column1 column2  
                                            80      1000   

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

我的代码

INSERT INTO table1 (column1, column2) VALUES (tran.column1, tran.column2);

【问题讨论】:

    标签: plsql insert oracle-sqldeveloper percentage


    【解决方案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 FOR EACH ROW 触发器。

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

    【讨论】:

    • 如果数据还没有在表中,这将是我的首选解决方案。绝对是前进的方向,但问题没有规定数据库版本是 11gR1 或更高版本。
    【解决方案2】:

    如果您的数据已经存在于表中,您只需更新该行:

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

    如果您使用的是最新的数据库版本并且可以更改表,我仍然会推荐 @mrjoltcola 的解决方案。它更加优雅,并允许您查看计算所基于的值。此 UPDATE 语句,如果多次运行,将导致您丢失 column2 的值。

    【讨论】:

    • 我已经编辑了我的帖子以使其更清晰。不,除非我使用插入代码,否则表中不存在第二条记录。所以这意味着它没有更新。我想插入从第一条记录复制的第二条记录,但只会更改第二条记录的 column2 值。 @Pete Mahon
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多