比较列并动态查找表中的差异

时间:2019-03-25 11:41:35

标签: text-processing scripting perl oracle

我有一个包含3列的表,第一列是某个参数,其余3个是这些参数的最后1周计数,其内容类似于以下内容。第一行是oracle的表列。我必须计算两个日期之间的差额。

Parameter    20190319   20190315    20190313
============================================
A    682            614         600         
B    194            194         190     
C    62             62          0

输出应如下所示,

Parameter    20190319   (20190319-20190315) 20190315    (20190315-20190313) 20190313
========================================================
 A   682            68      614         14      600         
 B   194            0       194         4       190     
 C   62             0        62         62      0

这里最棘手的部分是日期不是按顺序排列的,最多可以是7个日期,我们必须根据列名动态计算。如果可以在oracle中完成,那就太好了。谢谢!!

2 个答案:

答案 0 :(得分:0)

像这样吗?

#!/usr/bin/perl

use strict;
use warnings;

while (<DATA>) {
        chomp;
        my @line = split;
        my $diff1 = $line[1] - $line[2];
        my $diff2 = $line[2] - $line[3];
        print "$line[0]\t$line[1]\t$diff1\t$line[2]\t$diff2\t$line[3]\n";
}

__DATA__
A    682            614         600         
B    194            194         190     
C    62             62          0

输出

$ perl t.pl 
A   682 68  614 14  600
B   194 0   194 4   190
C   62  0   62  62  0

您问题中C行的输出看起来不正确。您是怎么计算出来的?

答案 1 :(得分:0)

最后,我能够写出解决方案,谢谢大家的支持!特别是Ashish:)

================================================ =========================== 声明

x varchar2(2000):= NULL; y varchar2(4000):= NULL;

开始

for i in(select column_id,column_name,lead(column_name,1) OVER (ORDER BY column_id) next_column 
    from all_tab_cols where table_name='TABLE_NAME' and column_name not in ('Parameter'))
loop

    if i.next_column != 'NULL' then
        x := x||'NVL("'||i.column_name||'",0) as "'||i.column_name||'",NVL("'||i.column_name||'", 0)-NVL("'||i.next_column||'", 0) as "'||i.column_name||'~",';
    else
        x := x||'NVL("'||i.column_name||'",0) as "'||i.column_name||'"';
    end if;    
 end loop;

y :=  'create  table TABLE_NAME_NEW as select Parameter,'|| x || ' from TABLE_NAME
order by  Parameter';
--dbms_output.put_line('y :'||y);  
execute immediate y;

END;

/