我有一个每月有两列的表,就像这个
表1:
_____________________________________________________________________
|item | jan_p | jan_r | feb_p | feb_r | commpany|
|______|___________|___________|____________|___________|____________
|1294 | 1234232 | 2323322 | 1242122 | 532323 | E987 |
|______|___________|___________|____________|___________|___________|
我需要将数据传输到一个新的,更规范化的表格,如下所示:
表2:
________________________________________________
| item | month | cost_p | cost_r | company |
|_______|_______|_________|_________|__________|
| 1294 | 1 |1234232 | 2323322| E987 |
| 1295 | 2 |1242122 | 532323 | E987 |
|_______|_______|_________|_________|__________|
我编写了一个循环迭代第一个表,并使用嵌套循环为每个月插入一行,如下所示:
for reg in (select * from table1) loop
for x in 1..12 loop
case x
when 1 then
insert into table2(..., mes , ...) values(... , x, ...)
when 2 then
insert into table2(..., mes , ...) values(... , x, ...)
这是有效的,但我只是想知道是否有另一种方法可以达到相同的结果。
答案 0 :(得分:0)
“我只是想知道是否还有另一种方法来实现这一目标”
是的。这是INSERT ALL语法的理想用例。
insert all
into table2 (item, month, cost_p, cost_r, commpany )
values (item, 1, jan_p, jan_r, commpany)
into table2 (item, month, cost_p, cost_r, commpany )
values (item, 2, feb_p, feb_r, commpany)
into table2 (item, month, cost_p, cost_r, commpany )
values (item, 3, mar_p, mar_r, commpany)
into table2 (item, month, cost_p, cost_r, commpany )
values (item, 4, apr_p, apr_r, commpany)
into table2 (item, month, cost_p, cost_r, commpany )
values (item, 5, may_p, may_r, commpany)
into table2 (item, month, cost_p, cost_r, commpany )
values (item, 6, jun_p, jun_r, commpany)
....
select * from table1
/
多表插入允许我们做一些非常整洁的事情,但仍然使用set操作。 Find out more。
答案 1 :(得分:0)
可能你可以使用pivot / unpivot功能吗?我不使用这些,但我认为它解决了你的任务。
Oracle PIVOT子句允许您从Oracle 11g开始编写交叉表查询。这意味着您可以汇总结果并将行旋转到列中。
PS我记得Tom Kite解决了它以前的问题。 请注意:https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:31263576751669#76663048528720