【问题标题】:Loop through each record from a table and a calculated record into other table in Oracle将表中的每条记录和计算记录循环到Oracle中的其他表中
【发布时间】:2010-10-26 04:57:37
【问题描述】:

我是 Oracle 10g 的新手。我有几个表,如下所示:

INCOME_MASTER
INCOME_ID     NUMBER(10) sEQ NUMBER,
INCOME_TYPE   VARCHAR2(10),
INCOME_DATE   DATE

INCOME_DETAILS
INCOME_DETAILS_SEQ_NO     NUMBER(10) SEQUENCE,
INCOME_ID                 NUMBER(10),
ITEM_ID                   NUMBER(10),
ITEM_VALUE                NUMBER (10,2)

我在两个表中都有很多值。

我需要查询 INCOME_MASTER 表中的所有记录,并且对于 INCOME_MASTER 表中的每条记录,我需要循环遍历

SELECT INCOME_ID FROM INCOME_MASTER
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=201
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=202
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=203
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=204

我需要从 ITEM_ID 202,203,204 中添加值并从 ITEM_ID=201 值中减去值

无论我得到什么值,我都需要在 INCOME_DETAILS 中插入一条新记录

insert into INCOME_DETAILS 
  values(INCOME_ID,205,value from above)

我想对 Income_master 表中的所有记录都这样做

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案1】:

    我的神谕生锈了,但应该是这样的...... 在处理 sql 时,您希望成组思考,而不是逐行思考。 您可以注释第一行并运行它以预览将插入到表中的数据。

    INSERT INTO INCOME_DETAILS(INCOME_ID, ITEM_ID, ITEM_VALUE)
    SELECT  INCOME_MASTER.INCOME_ID, 205, b+c+d-a
    FROM    INCOME_MASTER
            INNER JOIN 
            (
                SELECT  INCOME_MASTER.INCOME_ID, 
                        SUM(DECODE(ITEM_ID, 201, ITEM_VALUE, 0)) a,
                        SUM(DECODE(ITEM_ID, 202, ITEM_VALUE, 0)) b,
                        SUM(DECODE(ITEM_ID, 203, ITEM_VALUE, 0)) c,
                        SUM(DECODE(ITEM_ID, 204, ITEM_VALUE, 0)) d
                FROM    INCOME_MASTER
                        INNER JOIN INCOME_DETAILS
                            ON INCOME_MASTER.INCOME_ID = INCOME_DETAILS.INCOME_ID
                WHERE   INCOME_DETAILS.ITEM_ID IN (201,202,203,204)
                GROUP BY INCOME_MASTER.INCOME_ID
            ) details
                ON INCOME_MASTER.INCOME_ID = details.INCOME_ID;
    

    【讨论】:

    • 非常感谢您的帮助。b、c 的值可以是负值,但它们显示为 0。请帮助
    • clyc,你能帮忙吗? b 和 C 值可以是负值,但在我们使用 MAX 时它们显示为零
    • 代替 Max,尝试使用 SUM
    • +1 SUM 确实解决了这个问题(除了删除第 10 行的逗号)。
    • 修正了拼写错误并将最大值更改为总和。感谢您捕捉额外的“,” leigh :)
    【解决方案2】:

    我同意 clyc,你需要分组思考。除非我们遗漏细节,否则此操作不需要任何程序代码。

    样本数据:

    create table income_master (
       income_id   number(10),
       income_type varchar2(10),
       income_date date
       );
    
    create table income_details (
       income_details_seq_no number(10),
       income_id             number(10),
       item_id               number(10),
       item_value            number(10,2)
       );
    
    insert into income_master values (1,'a',sysdate);
    insert into income_master values (2,'b',sysdate);
    insert into income_master values (3,'c',sysdate);
    insert into income_master values (4,'d',sysdate);
    
    insert into income_details values(1,1,201,1);
    insert into income_details values(2,1,202,20);
    insert into income_details values(3,1,203,300);
    insert into income_details values(4,1,204,4000);
    
    insert into income_details values(5,2,201,1);
    insert into income_details values(6,2,202,20);
    insert into income_details values(7,2,203,300);
    
    insert into income_details values(8,3,201,10);
    insert into income_details values(9,3,202,20);
    insert into income_details values(10,3,203,30);
    
    insert into income_details values(11,4,202,-90);
    insert into income_details values(12,4,202,-10);
    

    插入语句:

    INSERT INTO Income_Details (Income_Id, Item_Id, Item_Value) 
    (
      SELECT ma.Income_Id, 205, SUM(DECODE(de.Item_ID,201,-1,1) * de.Item_Value) 
      FROM Income_Master ma
      JOIN Income_Details de ON ma.Income_Id = de.Income_Id 
         AND de.Item_Id BETWEEN 201 and 204
      GROUP BY ma.Income_Id, 205
    );
    

    结果:

    select Income_Id, Item_Id, Item_Value from income_details WHERE Item_Id = 205;
    INCOME_ID              ITEM_ID                ITEM_VALUE             
    ---------------------- ---------------------- ---------------------- 
    3                      205                    40                     
    1                      205                    4319                   
    2                      205                    319                    
    4                      205                    -100                     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2015-01-31
      • 2021-02-16
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多