2017-03-03 2 views
-4

Ich habe eine Anforderung für eine Tabelle wie folgt. Wie Sie sehen können mgt_year, tot_dflt_mgt und to_accum_mgt Spalten. In Jahr Spalte, wo sein der Wert 39,772773 und accum Wert ist 1380,055 .Was ich will, ist, dass, wenn ich (to_accum_mgt - tot_dflt_mgt) tun mag ich dieses berechnete Ergebnis in vorherigen Zeilen wie in der Abbildung dargestellt. für das Jahr 2015 und so weiter für alle Hinter Jahren - dann ist dieses berechnete Ergebnis heißt 1.340,282227 wird zum Subtrahieren 65,7915 wie (65,7915 1.340,282227) verwendet. Ich habe dies in Excel getan, aber wie dieses Ergebnis in Oracle und SQL Server zu erreichen. Bitte vergib mir meine schlechte Englisch und Noob Formatierung.In Oracle Wie Subtrahieren vorherigen Wert in einer Spalte mit Berechnung der anderen Spalte

Table Image

+1

Bitte senden Daten als formatierten Text, [nicht Screenshots] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on- So-wenn-eine Frage zu stellen/285557 # 285557) – Aleksej

+0

Sie müssen sehr klar erklären, was die EINGÄNGE sind und was der gewünschte AUSGANG ist. Wenn ich richtig verstehe, erhält man mehrere Zeilen in drei Spalten. In jeder Zeile wird das Jahr angegeben, für jede Zeile der Wert "tot_dflt_mgt" und für die letzte Zeile "tot_accum_mgt". Aus diesen Eingaben muss für jede Zeile "tot_accum_mgt" berechnet werden. Ist das korrekt? Bitte bestätigen. – mathguy

+0

Ja, die dritte Spalte hat berechnete Werte. In der dritten Spalte "tot_accum_mgt" wird nur der Wert für das Jahr ** 2016 ** angegeben. Alle oben genannten Werte werden berechnet. – Ameya

Antwort

1

habe ich einen kleinen Tisch für Testzwecke ähnlich wie bei Ihnen. Dann zeigt die Abfrage unten, wie man diese Art von Problem löst, indem man analytische Funktionen verwendet. Es ist keine Zeile-für-Zeile-Verarbeitung erforderlich.

create table t (mgt_year, tot_dflt_mgt, tot_accum_mgt) as (
     select 2013, 10, null from dual union all 
     select 2014, 15, null from dual union all 
     select 2015, 9, null from dual union all 
     select 2016, 20, 600 from dual 
); 

select * from t; 

MGT_YEAR TOT_DFLT_MGT TOT_ACCUM_MGT 
-------- ------------ ------------ 
    2013   10 
    2014   15 
    2015   9 
    2016   20   600 


select mgt_year, tot_dflt_mgt, 
     max(tot_accum_mgt) over() - 
     nvl(sum(tot_dflt_mgt) over 
        (order by mgt_year 
          rows between 1 following and unbounded following) 
      , 0) as tot_accum_mgt 
from t; 

MGT_YEAR TOT_DFLT_MGT TOT_ACCUM_MGT 
-------- ------------ ------------- 
    2016   10   556 
    2014   15   571 
    2015   9   580 
    2016   20   600 
+0

Vielen Dank. das ist, was ich gesucht habe. – Ameya

+0

Hallo vielen Dank für Ihre Hilfe. Können Sie bitte eine Lösung für dieses Problem mit SQL Server 2005 vorschlagen – Ameya

0

Vielleicht jede Zeile seines Vorjahr anschließen?

Select y1.mgt_year ,y2.mgt_year ,(y1.to_accum_mgt - y2.tot_accum_mgt) as myresult from mytable y1 inner join mytable y2 on y1.mgt_year = (y2.mgt_year -1)

+0

Dies wird nicht funktionieren, da die meisten Werte 'y1.to_accum_mgt' beim Start" null "sind, also wird das Ergebnis der Subtraktion auch 'null' sein. Sie denken wahrscheinlich daran, die Antworten nacheinander zu berechnen, aber so funktioniert SQL nicht. – mathguy

+0

@mathguy, nein ich habe das OP verstanden, dass das Bild die Eingabetabelle war, vielleicht missverstehe ich es. Die Tabelle, die Sie erstellt haben, hat NULL in der dritten Spalte, seine nicht. Aber vielleicht bedeutet das OP, dass es das Ergebnis ist, nach dem er sucht. – Degan

+0

Sie missverstehen. Sehen Sie den Austausch unter dem ursprünglichen Post, wo ich das OP fragte und er bestätigte. Ich finde, dass es immer am besten ist, diesen Prozess zu durchlaufen, bevor man versucht, ein Problem zu lösen. Das habe ich auch in diesem Fall gemacht. – mathguy

Verwandte Themen