在 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;
注意,列名DESC
和DATE
都是Oracle中的保留字,需要像上图一样用引号引起来。使用不同的名称会更简单,例如 DESCRIPTION
和 ACTIVITY_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。
我有一个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;
注意,列名DESC
和DATE
都是Oracle中的保留字,需要像上图一样用引号引起来。使用不同的名称会更简单,例如 DESCRIPTION
和 ACTIVITY_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。