query mit berechnung einer endsumm in einer tabelle / ausgabe

query mit berechnung einer endsumm in einer tabelle / ausgabe

am 02.03.2007 16:15:40 von Patrick Bates

vielen dank für eure hilfe - leider komm ich nicht weiter und suche -
mittlwerweile
schon etwas verzweifelt - nach der lösung bei folgender problemstellung:

es liegt eine tabelle vor, welche so aussieht:

ID BELEG_ID QUELL_ID MENGE
1 1 -1 5
2 2 1 5
3 3 -1 6
4 3 -1 2
5 3 -1 10
6 4 -1 50
7 5 3 6
8 5 5 5
9 6 2 5


und jetzt zum gesuchten query:
ausgegeben werden sollen alle jene ID, wo die MENGE (QUELL_ID = -1) minus
der MENGE,
wo diese ID die QUELL_ID ist, ungleich '0' ist.

also in diesem fall wäre die ausgabe:

ID BELEG_ID MENGE
4 3 2
5 3 5
6 4 50

und zu guter letzt möchte ich das noch auf BELEG_ID gruppieren ....

ich bastle schon seit stunden an sum(), join und sonstigem herum, komm aber
nicht zur lösung.

wer entfernt das brett vor meinem kopf ;-)


greets
-/--\-
alex

Re: query mit berechnung einer endsumm in einer tabelle / ausgabe

am 02.03.2007 17:29:43 von Daniel Fischer

Alexander Kainz!

> und jetzt zum gesuchten query:
> ausgegeben werden sollen alle jene ID, wo die MENGE (QUELL_ID = -1)
> minus der MENGE,
> wo diese ID die QUELL_ID ist, ungleich '0' ist.

ich bin mir nicht sicher, ob ich das richtig parse, aber der folgende
Query liefert jedenfalls deine Ausgabe:

SELECT a.id,a.beleg_id,a.menge-COALESCE(b.menge,0) AS mdiff
FROM tabelle a
LEFT JOIN tabelle b ON a.id = b.quell_id
WHERE a.quell_id = -1 AND a.menge-COALESCE(b.menge,0) != 0;

(Wenn unten nicht das mit dem Gruppieren stuende, koenntest du den teil
nach dem AND in der WHERE-Klausel durch ein "HAVING mdiff != 0" ersetzen.)

> also in diesem fall wäre die ausgabe:
>
> ID BELEG_ID MENGE
> 4 3 2
> 5 3 5
> 6 4 50
>
> und zu guter letzt möchte ich das noch auf BELEG_ID gruppieren ....

Gerne, dazu brauchst du nur ein GROUP BY a.beleg_id am Ende. Aber du hast
irgendwie nicht erwaehnt, wie die anderen Spalten aggregiert werden
sollen. Ich rate einfach mal:

SELECT GROUP_CONCAT(a.id) AS ids, a.beleg_id,
SUM(a.menge-COALESCE(b.menge,0)) AS mdiff
FROM tabelle a
LEFT JOIN tabelle b ON a.id = b.quell_id
WHERE a.quell_id = -1 AND a.menge-COALESCE(b.menge,0) != 0
GROUP BY a.beleg_id;

> wer entfernt das brett vor meinem kopf ;-)

Das geht normalerweise mit einem Hammer.


Gruß
Daniel

Re: query mit berechnung einer endsumm in einer tabelle / ausgabe

am 02.03.2007 19:22:51 von Patrick Bates

"Daniel Fischer" schrieb im Newsbeitrag
news:pan.2007.03.02.16.29.42.798526@df.erinye.com...
> Alexander Kainz!
>
> ich bin mir nicht sicher, ob ich das richtig parse, aber der folgende
> Query liefert jedenfalls deine Ausgabe:
>
> SELECT a.id,a.beleg_id,a.menge-COALESCE(b.menge,0) AS mdiff
> FROM tabelle a
> LEFT JOIN tabelle b ON a.id = b.quell_id
> WHERE a.quell_id = -1 AND a.menge-COALESCE(b.menge,0) != 0;

vielen dank. in andere form hab ich in die richtung schon getüftelt.
COALESCE ist
übrigens ein super-hinweis!

stark vereinfacht muss die berechnung bzw. ausgabe folgendermassen ablaufen
(ich
habe das beispiel verändert, um es deutlicher darzustellen):

ID BELEG_ID QUELL_ID MENGE
23 47 -1 3
61 72 23 2
63 74 23 1

so, und jetzt das query in human-language:

zeige ID wo QUELL_ID = -1 als 'BASIS_ID' und MENGE dieses Datensatz minus
summe
aller mengen wo QUELL_ID = BASIS_ID

in obiger Liste dürfe demnach kein Datensatz gefunden werden, weil die
Ausgangsmenge
von 3 (ID 23) minus 2 (ID 61) und minus 1 (ID 63) = 0


>
> Das geht normalerweise mit einem Hammer.
>

wird sich hoffentlich vermeiden lassen ;-)


greets
-/--\-
alex