Fortlaufende Summe in Abfrage?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

BaseUser
Beiträge: 9
Registriert: Di, 29.05.2007 14:33

Fortlaufende Summe in Abfrage?

Beitrag von BaseUser »

Tabelle (bzw. Abfrage) werte

id / wert
0 / 5
1 / 8
2 / 4
3 / 7

Wie formuliere ich eine Abfrage so, dass er mir sagt, dass in der Zeile mit dem ID-Wert 2 die Summe der Werte den Betrag von 15 erreicht bzw. überschreitet?

Vielen Dank für die Mühe bereits jetzt!

Gruß BaseUser
sarotti
****
Beiträge: 105
Registriert: So, 12.03.2006 17:40
Wohnort: Nähe Krefeld

Re: Fortlaufende Summe in Abfrage?

Beitrag von sarotti »

Hallo BaseUser,

...das sollte mit "CASEWHEN" funktionieren....

Code: Alles auswählen

SELECT CASEWHEN( "wert" = 15, 'Wert ist größer als 15', 'Wert ist kleiner als 15' ), "ID" FROM "werte" AS "werte" WHERE ( ( "ID" = 2 ) )
...probiers mal :)

Viel Erfolg

Gruss
sarotti
BaseUser
Beiträge: 9
Registriert: Di, 29.05.2007 14:33

Re: Fortlaufende Summe in Abfrage?

Beitrag von BaseUser »

Entschuldigung ich habe die Frage vollkommen falsch formuliert.

Ich will den Wert 15 vorgeben und die Abfrage soll mir beantworten, in welcher Zeile dieser Wert erreicht bzw. überschritten wird.

Das Ergebnis der Abfrage würde also etwa so aussehen:

id / wert / lfdSumme
0 / 5 / 5
1 / 8 / 13
2 / 4 / 17
3 / 7 / 24

Jetzt würde er also zurückgeben: In der Zeile mit dem id-Wert 2 wird der Zielwert 15 erreicht/überschritten.

So, und wie baue ich nun diese Abfrage??
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Fortlaufende Summe in Abfrage?

Beitrag von Barlee »

Hallo BaseUser,

Hier eine mögliche Lösung.
Annahme:
Tabellenname Tab_Werte,
Spaltennamen ID, Werte

Code: Alles auswählen

select 
x.ID, 
x.Werte, 
x.Summe 

from

(
  select 

  a.ID,
  a.Werte,
  (select sum(b.Werte) from Tab_Werte b where a.ID>=b.ID) as Summe,
  (select sum(b.Werte) from Tab_Werte b where a.ID>=b.ID)-14 as Rest

  from Tab_Werte a

  where (select sum(b.Werte) from Tab_Werte b where a.ID>=b.ID)-14 >0
) x,

(
  select min(c.Rest) as Minimum from
  (
    select 

    (select sum(b.Werte) from Tab_Werte b where a.ID>=b.ID)-14 as Rest

    from Tab_Werte a

    where (select sum(b.Werte) from Tab_Werte b where a.ID>=b.ID)-14 >0
  ) c

) y

where x.Rest = y.Minimum
Hoffe, es hilft.

Gruss Barlee
BaseUser
Beiträge: 9
Registriert: Di, 29.05.2007 14:33

Re: Fortlaufende Summe in Abfrage?

Beitrag von BaseUser »

Hallo Barlee,

wie soll ich Dir danken?

Also vorab: Die Abfrage funktioniert genau so wie Du sie vorgegeben hast.
Es ist mir (Base-Einsteiger seit Ende Mai 2007) noch nicht gelungen, die Abfrage bis zu Ende zu analysieren.
Jedenfalls Hochachtung vor dieser Leistung!

Wenn es mir irgendwann gelingt (ab heute leider Unterbrechung wegen Urlaub), den Befehl vollständig zu analysieren werde ich viel davon gelernt haben!

Vielen, vielen Dank

von BaseUser
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Fortlaufende Summe in Abfrage?

Beitrag von Barlee »

Hallo BaseUser,

Gern geschehen! Es freut mich, wenn ich helfen konnte.

Vielleicht ein paar Tips, die beim eigenen analysieren helfen können.

Die gesamte Abfrage besteht aus mehreren "kleinen" Abfragen inkl. Unterabfragen. Die kleineren Abfragen liefern Ergebnistabellen, denen ein Alias (x, c, y) zugewiesen wurde. Führe diese am besten einmal separat aus und schaue Dir das Ergebnis an.
Diese Ergebnistabellen werden anschließend benutzt, um darüber erneut abzufragen und auf darin enthaltene Werte (z.b. x.Rest, y.Minimum, c.Rest) zurückzugreifen, wobei bspw. y.Minimum für die Spalte "Minimum" in der Ergebnistabelle "y" steht.

Zur Arbeitsweise:

Abfrage mit Alias x
Stichwort Self-Join, dieselbe Ausgangstabelle wird zweimal abgefragt.
Hier werden zusätzlich zu den bestehenden Tabellenpalten zwei neue erzeugt, "Summe" und "Rest". Dabei enthält "Summe" -wie der Name schon sagt- die Aufsummierung aller bisherigen Werte. Die Spalte "Rest" wird genauso wie "Summe" berechnet. Jedoch wird vom jeweiligen Ergebnis 14 subtrahiert, da Dein Schwellenwert mit 14 angegeben war. Erreiche ich in dieser Spalte Ergebnisse grösser Null, dann ist der Schwellenwert überschritten. Weil Ergebnisse kleiner gleich Null daher uninteressant sind (Schwellenwert nicht überschritten), schränkt die WHERE-Klausel die Ergebnisse auf größer Null ein. Beachte, dass die Anweisungen für "Summe", "Rest" und die in der WHERE Klausel zu großen Teilen identisch sind!

Abfrage mit Alias c
Identisch mit x!! Keine neuen Anweisungen! Sie beschränkt sich lediglich auf die Ergebnisspalte "Rest", um darüber dann das Minimum bilden zu können. Die Spalten "ID", "Werte", "Rest" sind hier nur weggelassen worden.

Abfrage mit Alias y
Diese ermittelt nun das Minimum der Spalte "Rest" aus voriger Abfrage. Dieses Minimum steht in der Zeile, in der als erstes Dein definierter Schwellenwert überschritten wurde.
---

So, was haben wir jetzt:
1) Eine Ergebnistabelle (x) mit den Werten Deiner Ausgangstabelle inkl. Summe und Rest bis zum Schwellenwert
2) Eine Ergebnistabelle (y) mit dem Wert von "Rest", an dem die Schwelle überschritten wird.

Nun naht das Ende ...
Formulieren kann man jetzt: Gib mir alles aus Ergebnistabelle x zurück, bei dem der Wert in Spalte "Rest" gleich dem ist, der in Ergebnistabelle y steht (und da steht nur einer). Das geschieht durch das äußere SELECT und abschließender WHERE-Klausel.

Also BaseUser, alles keine Hexerei. Du wirst sehen, so schwer ist das gar nicht.
Ich wünsche weiterhin viel Erfolg!

Gruss Barlee
Antworten