Oracle: Summen bis n-Zeitpunkte

Ein kleines Problem habe ich leider noch:

Folgende Situation:
Zu einem Datum gibt es zwei Rechnungseingänge, aber nur einen Zahlungseingang.
Das SQL-Statement gibt folgendes Ergebnis:

04.10.2010 RE-Betrag 100 Zahlung 90
04.10.2010 RE-Betrag 200 Zahlung 90

Das ist so ja nicht richtig. Es müsste heissen:

04.10.2010 RE-Betrag 100 Zahlung 90
04.10.2010 RE-Betrag 200 Zahlung 0

Oder noch einfacher

04.10.2010 RE-Betrag 300 Zahlung 90

Magst Du Dir das noch einmal ansehen?
 
die Struktur der verknüpften Daten ist mir noch nicht völlig klar geworden, aber wenn die Rechnungseigänge und die Zahlungseingänge in unterschiedlichen Tabellen liegen, dann könnte man die Inhalte vor dem Joinen auf Tagesbasis gruppieren, also ungefähr:
Code:
-- als Pseudocode ohne Berücksichtigung der Datumsreferenz, des Outer Joins und der Analytics
select ...
  from (select datum
             , sum(RE-Betrag) RE-Betrag 
          from ...) t1,
       (select datum
             , sum(Zahlung ) Zahlung 
          from ...) t2
  where ...
Das sollte dann zum einfachen Ergebnis führen (04.10.2010 RE-Betrag 300 Zahlung 90)

Gruß
MP
 
... ich weiss es ist schon fast peinlich, aber wie bzw. an welche stelle soll ich denn die Gruppierung einbauen?
Du glaubst ja gar nciht wie dankbar ich Dir bin :-)
 
kein Problem; wenn ich in meiner ersten Testtabelle einen zweiten Satz für einen vorliegenden Tag einbaue, erhalte ich für dieses Datum mit der ursprünglichen Analysequery ebenfalls zwei Ergebnisse für diesen Tag:
Code:
insert into test values ('06.01.2010', 150);

select t4.*
     , nvl(t4.sum_wert, 0) - nvl(t4.sum_wert2, 0) wert_diff
  from (select t3.*
             , sum(wert) over(order by datum) sum_wert
             , sum(wert2) over(order by datum) sum_wert2
          from (select ref.datum
                     , t1.wert
                     , t2.wert2
                  from (select to_date('01.01.2010') - 1 + rownum datum
                          from dual
                       connect by level < 20) ref
                  left outer join
                       test t1
                    on (ref.datum = t1.datum)
                  left outer join
                       test2 t2
                    on (ref.datum = t2.datum)
                ) t3
        ) t4;

DATUM            WERT      WERT2   SUM_WERT  SUM_WERT2  WERT_DIFF
---------- ---------- ---------- ---------- ---------- ----------
01.01.2010                                                      0
02.01.2010        100                   100                   100
03.01.2010                    90        100         90         10
04.01.2010        100                   200         90        110
05.01.2010                    90        200        180         20
06.01.2010        100                   450        180        270 <-- Nr. 1
06.01.2010        150                   450        180        270 <-- Nr. 2
07.01.2010                    90        450        270        180
08.01.2010        100                   550        270        280
09.01.2010                    90        550        360        190
10.01.2010        100                   650        360        290
11.01.2010                    90        650        450        200
12.01.2010        100                   750        450        300
13.01.2010                    90        750        540        210
14.01.2010        100                   850        540        310
15.01.2010                    90        850        630        220
16.01.2010        100                   950        630        320
17.01.2010                    90        950        720        230
18.01.2010        100                  1050        720        330
19.01.2010                    90       1050        810        240
Das lässt sich durch die Gruppierung vor dem Join vermeiden:
Code:
select t4.*
     , nvl(t4.sum_wert, 0) - nvl(t4.sum_wert2, 0) wert_diff
  from (select t3.*
             , sum(wert) over(order by datum) sum_wert
             , sum(wert2) over(order by datum) sum_wert2
          from (select ref.datum
                     , t1.wert
                     , t2.wert2
                  from (select to_date('01.01.2010') - 1 + rownum datum
                          from dual
                       connect by level < 20) ref
                  left outer join
                       (select datum
                             , sum(wert) wert
                          from test
                         group by datum) t1
                    on (ref.datum = t1.datum)
                  left outer join
                       test2 t2
                    on (ref.datum = t2.datum)
                ) t3
        ) t4

DATUM            WERT      WERT2   SUM_WERT  SUM_WERT2  WERT_DIFF
---------- ---------- ---------- ---------- ---------- ----------
01.01.2010                                                      0
02.01.2010        100                   100                   100
03.01.2010                    90        100         90         10
04.01.2010        100                   200         90        110
05.01.2010                    90        200        180         20
06.01.2010        250                   450        180        270
07.01.2010                    90        450        270        180
08.01.2010        100                   550        270        280
09.01.2010                    90        550        360        190
10.01.2010        100                   650        360        290
11.01.2010                    90        650        450        200
12.01.2010        100                   750        450        300
13.01.2010                    90        750        540        210
14.01.2010        100                   850        540        310
15.01.2010                    90        850        630        220
16.01.2010        100                   950        630        320
17.01.2010                    90        950        720        230
18.01.2010        100                  1050        720        330
19.01.2010                    90       1050        810        240
Statt der ursprünglichen Tabelle verwende ich also eine Inline-View, die die Tagesergebnisse aggregiert.

Gruß
MP
 
Wow! Das sieht perfekt aus.
Ich habe nur noch so meine Probleme, dass mit meinen Tabellen bzw. Spalten darzustellen. Ich bekomme immer die Fehlermeldung "ungültiger Spaltenname".
Zum testen habe ich einfach mal die Tabelle test um die Spalte "rechnung_datum" und die Tabelle test2 um die Spalte "z_beleg_datum" erweitert und folgenden Code benutzt:
Code:
select t4.*
     , nvl(t4.sum_wert, 0) - nvl(t4.sum_wert2, 0) wert_diff
  from (select t3.*
             , sum(wert) over(order by datum) sum_wert
             , sum(wert2) over(order by datum) sum_wert2
          from (select ref.datum
                     , t1.wert
                     , t2.wert2
                  from (select to_date('01.01.2010') - 1 + rownum datum
                          from dual
                       connect by level < 20) ref
                  left outer join
                       (select datum
                             , sum(wert) wert
                          from test
                         group by datum) t1
                    on (ref.datum = t1.rechnung_datum)
                  left outer join
                       test2 t2
                    on (ref.datum = t2.z_beleg_datum)
                ) t3
        ) t4

Wie gesagt, leider bekomme ich immer wieder die Fehlermeldung. An welcher Stelle muss ich das denn genau ändern?
 
in der Inline-View t1 wird nach dem Datum gruppiert und noch nicht nach rechnung_datum. Wenn rechnung_datum in der Tabelle test vorliegt, müsste Folgendes funktionieren:
Code:
select t4.*
     , nvl(t4.sum_wert, 0) - nvl(t4.sum_wert2, 0) wert_diff
  from (select t3.*
             , sum(wert) over(order by datum) sum_wert
             , sum(wert2) over(order by datum) sum_wert2
          from (select ref.datum
                     , t1.wert
                     , t2.wert2
                  from (select to_date('01.01.2010') - 1 + rownum datum
                          from dual
                       connect by level < 20) ref
                  left outer join
                       (select rechnung_datum
                             , sum(wert) wert
                          from test
                         group by rechnung_datum) t1
                    on (ref.datum = t1.rechnung_datum)
                  left outer join
                       test2 t2
                    on (ref.datum = t2.z_beleg_datum)
                ) t3
        ) t4

Gruß
MP
 
Zurück