我有一个包含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中完成,那就太好了。谢谢!!
答案 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;