在 oracle 中将数据插入另一个具有不同数据结构的 table

Inserting data in another table having different data structure in oracle

我有一个table table1

ITEM_CODE             DESC       MONTH      DAY01  DAY02  DAY03
FG0050BCYL0000CD     CYL HEAD    FEB-15       0       204   408
FG00186CYL0000CD     POWER UNIT  FEB-15       425    123    202

我想以这种方式从 table1 中的另一个 table table2 中插入数据。

ITEM_CODE                           MONTH        DATE       QUANTITY
FG0050BCYL0000CD                    FEB-15    01-FEB-2015      0
FG0050BCYL0000CD                    FEB-15    02-FEB-2015      204
FG0050BCYL0000CD                    FEB-15    03-FEB-2015      408
FG00186CYL0000CD                    FEB-15    01-FEB-2015      425
FG00186CYL0000CD                    FEB-15    02-FEB-2015      123
FG00186CYL0000CD                    FEB-15    03-FEB-2015      202

请告诉我如何通过 pl sql

实现

以下内容应该可以帮助您关闭:

BEGIN
  FOR aRow IN (SELECT * FROM TABLE1)
  LOOP
    INSERT INTO TABLE2(ITEM_CODE, MONTH, "DATE", QUANTITY)
      VALUES (aRow.ITEM_CODE, aRow.MONTH,
              TO_DATE(aRow.MONTH, 'MON-RR')+0, aRow.DAY01);

    INSERT INTO TABLE2(ITEM_CODE, MONTH, "DATE", QUANTITY)
      VALUES (aRow.ITEM_CODE, aRow.MONTH,
              TO_DATE(aRow.MONTH, 'MON-RR')+1, aRow.DAY02);

    INSERT INTO TABLE2(ITEM_CODE, MONTH, "DATE", QUANTITY)
      VALUES (aRow.ITEM_CODE, aRow.MONTH,
              TO_DATE(aRow.MONTH, 'MON-RR')+2, aRow.DAY03);
  END LOOP;
END;

注意,列名DESCDATE都是Oracle中的保留字,需要像上图一样用引号引起来。使用不同的名称会更简单,例如 DESCRIPTIONACTIVITY_DATE,这样就无需在每次使用这些名称时都引用它们。

祝你好运。

这个 SQL 查询对我有用。

with items as (
  select table1.*, 
      to_date(month||'-01', 'MON-YY-DD', 'NLS_DATE_LANGUAGE=American') day
    from table1)
select item_code, month, day + lvl - 1 day,
    case extract(Day from day + lvl - 1)
      when 1 then day01 
      when 2 then day02
      when 3 then day03    
      -- <- insert rest (day04...day30) here
      when 31 then day31
    end value
  from items
    join (select level lvl from dual connect by level<32) n
      on day + lvl - 1 <= last_day(day)

子查询 items 将月份的第一天附加到数据。接下来,我将此子查询与其他分层子查询结合起来, 它给出了 31 个数字的简单列表(表格 1 到 31)。 Join 的构造方式是日期不能超过一个月的最后一天。 因此,对于 table1 中的每一行,我们有 28、29、30 或 31 行具有正确的日期。 现在简单但乏味的任务——每天我们都必须从适当的列中获取价值;我们需要 case 这里。 在解决方案中,这些是四行,但您需要完成休息。

最后将结果插入表2。