Сравните столбцы и найдите разницу в таблице динамически - PullRequest
0 голосов
/ 25 марта 2019

У меня есть таблица с 3 столбцами, первый столбец - это некоторый параметр, а остальные 3 - это число последних 1 недели для этого параметра, содержание которого аналогично приведенному ниже. Первая строка - это столбцы таблицы из оракула. Я должен рассчитать разницу 2 даты.

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 дат, мы должны динамически вычислять по именам столбцов. Было бы здорово, если бы можно было сделать в оракуле. Спасибо !!

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Наконец-то я смог написать решение, спасибо всем за поддержку! Специально Ашиш:)

=============================================== ============================ DECLARE

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; * * 1 010

/

0 голосов
/ 26 марта 2019

Что-то вроде этого?

#!/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 в вашем вопросе выглядит неправильно.Как вы рассчитали это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...