我有一个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中的另一个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
实现这一目标答案 0 :(得分:2)
这个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)。加入是这样构建的,日期不能超过一个月的最后一天。
因此,对于table1中的每一行,我们有28,29,30或31行具有适当的日期。
现在简单但繁琐的任务 - 每天我们必须从适当的专栏中获得价值;我们需要case
。
在解决方案中,这些是四行,但您需要完成休息。
最后只需将结果插入table2。
答案 1 :(得分:1)
以下内容应该让您关闭:
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;
请注意,列名DESC
和DATE
都是Oracle中的保留字,需要引用它们,如上所示。使用不同的名称(例如DESCRIPTION
和ACTIVITY_DATE
)可以更简单,无需在每次使用时引用这些名称。
祝你好运。