【问题标题】:Compare columns and find the difference from a table dynamically比较列并动态查找表中的差异
【发布时间】:2019-08-17 02:29:56
【问题描述】:

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

【问题讨论】:

  • 您应该显示用于检索数据的 SQL 查询。
  • 当您说“Oracle”时,您的意思是一些数据库引擎,对吧?您应该能够在查询中解决此问题。
  • @Bodo,该表包含不同日期的数据,我不确定我还能提供什么。
  • @Kusalananda,我无法使用查询来解决,这就是我在这里发布的原因。感谢您的宝贵时间
  • @SenthilPrabuS 这个问题适用于例如如果包含 SQL 架构和当前 SQL 查询,则 StackOverflow。

标签: text-processing scripting perl oracle


【解决方案1】:

这样的?

#!/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 行的输出看起来不正确。你是怎么计算的?

【讨论】:

  • 谢谢阿什!但我不确定会有多少个日期才能找到差异,最多可能存在 10 天。是否可以进行相应的修改?这里 DATA 也是一个文件,对吧?
  • 您可以在stackoverflow.com/questions/13463509/the-data-syntax-in-perl 找到有关 的更多信息,将所有日期复制到 DATA 行下方并尝试运行代码,分享其工作原理以及预期结果不符合您的要求。
【解决方案2】:

终于可以写出解决方案了,谢谢大家的支持!特别是 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;

结束;

/

【讨论】:

    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2019-07-19
    • 2020-03-08
    相关资源
    最近更新 更多