如何在oracle的表中将多行组合成一行,并将结果存储在其他表中

时间:2016-05-20 06:07:53

标签: oracle

示例数据:表由96000行组成,我想将它们组合成16000行

第1行:1255467861 40825825 IDF + 0149502016010615210300000396000026 + 0000651 + 00000000000000+ |

第2行:000000000 + 0000000 + 0000000 + 000000677 + 02 YY 0444410100000 00 0001000000054 + 10001EB4200002 + 00000 + 0000052 + 0000000 + 0000000 + |

第3行:00000 00000 + 00000 + 0000000 + 0000000 + 0000000 + 00000 00000 + 00000 + 0000000 + 0000000 + 0000000 + 00000 00000 + 00000 + 0000000 + 0000000 + |

第4行:0000000 + 00000 00000 + 00000 + 0000000 + 0000000 + 0000000 + 00 004 1 000000000000 0000000000 M5 |

第5行:00000000 + 00000000000000000000000000000000000000 + 00000000001011 Y 000000000+ |

第6行:0000000 + 0000000 + 0000000 + AB0002210000000000FIABMM81 15067195 0000000000009403228870 |

2 个答案:

答案 0 :(得分:0)

假设您知道对行进行分组的条件(示例中的column1,column2)是什么,我建议您使用aggregate functions函数,例如SUM(),MAX()和COUNT()来聚合数据,按标准分组,并插入目标表。

<强> E.G。

insert into my_target_table
Select column1, column2, sum(column3), max(column4), count(1) as column5
from my_source_table
group by column_1, column2

答案 1 :(得分:0)

假设“第1行,第2行,第3行”具有某种含义,您必须在某处显示另一列显示顺序。在我下面的设置中,我假设你有一个“id”(不一定是从1开始的连续数字;它可以是数字,或者它可以是日期等等 - 为了说明我使用一些随机数,它们也可以是分数,或负面等。 - 我建立“行号”形式)。如果您没有任何类型的排序,在row_number()函数的“order by”子句中,您可以简单地“按1排序”。但是,我假设您还希望从每组六个中捕获“id”的最小值(同样,id可能是日期或时间戳或其他)。

策略是创建“行号”。如果一切都从0开始,它会更好,所以我从row_number()值中减去1。然后按trunc(rn / 6)分组并按mod(rn,6)排序。

要连接字符串,请使用listagg。我假设你想要字符串与它们之间的NO分隔符连接;如果你确实想要将它们分开,例如#,则将第二个参数更改为listagg,从''更改为'#'。

查询(包括设置数据,我缩短了输入字符串,我添加了一些以显示一切是如何工作的):

with test_data(id, input_str) as (
        select  1, '12554861 40825825 IDF+0140000000+|'    from dual union all
        select  2, '0000000+00052+0000000+0000000+|'       from dual union all
        select  4, '00000 000+00000+0+00000+000+0000000+|' from dual union all
        select  9, '00000+0000000+000000000000 M5|'        from dual union all
        select 14, '000000 +000000000011 Y 000000000+|'    from dual union all
        select 23, '000000IABMM81 15067195 0000003228870|' from dual union all
        select 31, '125508825 IDF+0143333300000+|'         from dual union all
        select 32, '0000+052+0000AXZC000+0000000+|'        from dual union all
        select 37, '000MMDOQ000+0+00000+0000000+0000000+|' from dual union all
        select 45, '000000 +00000000001011 Y 000000000+|'  from dual union all
        select 46, '00000+0000FIAB1 15067195 000CCV70|'    from dual
     ),
     has_rn (id, input_str, rn) as (
        select id, input_str, row_number() over (order by id) - 1
        from   test_data
     )
select   min(id) as id, 
         listagg(input_str, '') within group (order by mod(rn, 6)) as output_str
from     has_rn
group by trunc(rn/6);

输出(使用test_data cte中的示例输入):

ID OUTPUT_STR
-- -------------------------------------------------------------------------------------------------------------------
 1 12554861 40825825 IDF+0140000000+|0000000+00052+0000000+0000000+|00000 000+00000+0+00000+000+0000000+|00000+0000000+000000000000 M5|000000 +000000000011 Y 000000000+|000000IABMM81 15067195 0000003228870|
31 125508825 IDF+0143333300000+|0000+052+0000AXZC000+0000000+|000MMDOQ000+0+00000+0000000+0000000+|000000 +00000000001011 Y 000000000+|00000+0000FIAB1 15067195 000CCV70|