首页 > Oracle > Oracle 行转列,一个比较特殊的需求
2014
10-15

Oracle 行转列,一个比较特殊的需求

项目组BIEE报表有这样一个需求,有一些BAD表,是每天DS没有load成功的数据,每一张表对应都有一张BAD表,BAD表比DWI表要多16个字段,记载的就是这条记录load失败的原因,以及load失败的信息,比如log日志id,失败的这条记录的pk_name和pk_value,失败原因等信息,除开这16个字段的其他字段就和DWI表的字段一模一样,记录load失败的数据,现在需要把这些BAD的所有数据都转到一张detail表中,供报表使用,这样detail表的格式如下:

每天都需要把1000多张BAD表的数据,转换到这张bad_detail表中,所有字段转换成列的方式存储,这里就需要用到行转列功能,但一般的union all虽然也可以实现,但这样代码看起来比较多,而且感觉比较落后,下面是我使用的办法。

BAD结构大概如下:

插入数据测试:

转换后的detail表:

可以看到转换后的表结果,前面5个字段都是固定的,在每个BAD表中都有这几个字段,COLUMN_NAME和COLUMN_ORA_VALUE在查询与每个BAD表,然后把表中的所有数据都转换到detail表中,这样的话:BAD表如果有100个字段(除开那16个字段),当前有10条记录,那么插入到detail表中就会有1600条记录,当然这里就需要通过存储过程来实现这个转换功能,首先要取到所有的BAD表名,然后一个表循环,取到column名,然后再拼接,这里就不贴存储过程了。贴select部分的sql就够了:

其实在Oracle中的行转列还有其他方式,比如pviot等专用函数,不过要实现我这里的需求,暂且就只想到了这个办法。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL