在plsql oracle上将数据从列转换为行

时间:2017-04-07 19:17:45

标签: oracle plsql

我有一个每月有两列的表,就像这个

表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  |
|_______|_______|_________|_________|__________|

见图片https://ibb.co/cDM91Q

我编写了一个循环迭代第一个表,并使用嵌套循环为每个月插入一行,如下所示:

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, ...)

这是有效的,但我只是想知道是否有另一种方法可以达到相同的结果。

2 个答案:

答案 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