PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL: bedingte Summierung


RattuS
2010-06-03, 19:40:34
Hallo,

wahrscheinlich ein simples Problem: Ich möchte bis zu einem bestimmten Maximalwert in einer Tabelle die Werte einer Spalte summieren.

LfdNum | Wert
1 | 1
2 | 3
3 | 10
4 | 28

Bei einem Maixmalwert von 16 müsste das Ergebnis 3 sein, da 1+3+10 bereits 14 ergibt und die nächste Summe mit 42 zu hoch wäre.

Ich hab mit SUM, MAX und einer Abfrage-Verschachtelung schon rumgespielt, komme aber nicht zum Ziel. Zieldatenbanksystem ist SQLite. Danke im voraus.

Mit besten Grüßen,
RattuS

PS: Ich weiß, dass man das Ergebnis auch mit einer Funktion lösen kann, bestehe aber an dieser Stelle auf eine Abfrage.

Marscel
2010-06-03, 20:23:44
Frag mich nicht, ob das jetzt auch mit SQLite geht:
SELECT @a := 0;
SELECT MAX( id )
FROM (
SELECT @a := @a + val AS a, id
FROM test
) AS tbl
WHERE a <=16

wry
2010-06-03, 21:07:13
Hab das jetzt nicht getestet und weiß nicht wirklich ob das so einfach geht:
(allerdings mit SUM-Funktion)

SELECT SUM(wert) FROM table
WHERE wert <= 16

Edit:
Wiedermal an der Fragestellung gescheitert :redface:

Marscel
2010-06-03, 21:32:59
Nein, das summiert nur den Wert aus allen Zeilen, wo dieser kleiner-gleich 16 ist, das ergibt hier 14.

Er will ja die letzte ID/laufende Nummer haben, wo der Schwellwert noch nicht überschritten ist.

RattuS
2010-06-03, 22:11:14
Frag mich nicht, ob das jetzt auch mit SQLite geht:
SELECT @a := 0;
SELECT MAX( id )
FROM (
SELECT @a := @a + val AS a, id
FROM test
) AS tbl
WHERE a <=16
Funktioniert bei SQLite leider nicht.

Marscel
2010-06-04, 00:19:33
Ah, viel universeller möglich, nehm ich jedenfalls an:
SELECT MAX(id) FROM(SELECT *, (SELECT SUM(val) FROM test b WHERE b.id > 0 AND b.id <= a.id) AS sum FROM test a WHERE sum <= 16) AS tbl

-> 3

Setzt natürlich voraus, dass du den Startoffset kennst, wenn du nicht am Anfang anfangen willst

RattuS
2010-06-04, 12:52:34
Ah, viel universeller möglich, nehm ich jedenfalls an:
SELECT MAX(id) FROM(SELECT *, (SELECT SUM(val) FROM test b WHERE b.id > 0 AND b.id <= a.id) AS sum FROM test a WHERE sum <= 16) AS tbl
Setzt natürlich voraus, dass du den Startoffset kennst, wenn du nicht am Anfang anfangen willst
Wubnderbar, funktioniert. Der Offset ist immer bei 1, daher hab ich die erste Klausel beim WHERE einfach entfernt.