budda
Goto Top

Inner Join und Summen Problem

Hallo,

ich hab folgendes Problem. Ich habe eine Tabelle mit Belegkopfdaten in der sich unter anderem der Gesamtbetrag des Beleges befindet. Diese verbinde ich mit den Belegzeilen per Inner join.
Hat natürlich zur Folge das ich die Belegkopfdaten genau so oft habe wie es Treffer in den Belegzeilen gibt und somit eine Summe über den Gesamtbetrag ein viel zu hohes Ergebnis liefert.

Gibt es eine Möglichkeit den Gesamtbetrag nur beim ersten Ergebnis einzutragen und bei allen weiteren nicht? So das ich wieder vernünftig eine Summe bilden kann. Oder vielleicht eine ganz andere Lösung?

Statement sieht vereinfacht derzeit so aus:

Select * FROM Belegkopf K INNER JOIN Belegzeilen Z ON K.id = Z.parentid


Gruß
Tobi

Content-ID: 122141

Url: https://administrator.de/contentid/122141

Ausgedruckt am: 23.11.2024 um 00:11 Uhr

lobotomie
lobotomie 06.08.2009 um 09:23:54 Uhr
Goto Top
Da stellt sich die Frage welche Daten Du aus den Belegzeilen benötigst.

Loco Lobo
NanaBama
NanaBama 06.08.2009 um 09:35:39 Uhr
Goto Top
Hi Tobi,

wenn Du die Belegkopfdaten mit einem GroupBy zusammenfasst und den Gesamtbetrag summierst erhälst Du jeweils nur ein Ergebnis.
Ich weiß nicht ob Du Dir das so vorstellt, aber eine Möglichkeit ist es.

Grüße, Nana
Budda
Budda 06.08.2009 um 09:42:27 Uhr
Goto Top
Wir brauchen die Artikelnummern, Menge, etc. aus den Belegzeilen.

Momentan sieht das ja so aus:

Belegnr, Gesamtbetrag, Artikel, Menge
12345, 500,00, Kartoffel, 20
12345, 500,00, Möhre, 10
12345, 500,00, Apfel, 15

Und so bräuchte ich das:

Belegnr, Gesamtbetrag, Artikel, Menge
12345, 500,00, Kartoffel, 20
12345, 0, Möhre, 10
12345, 0, Apfel, 15

GroupBy wird mir da glaub ich nicht helfen.

Gruß
Tobi
AndreasHoster
AndreasHoster 06.08.2009 um 09:44:58 Uhr
Goto Top
Gibt es eine Möglichkeit den Gesamtbetrag nur beim ersten Ergebnis einzutragen und bei allen weiteren nicht?
Nein.

In der einzelnen Belegzeile steht doch der Betrag dieser Belegzeile drin, oder? Dann addiere doch einfach die zusammen. Wenn Du da alle Belegzeilen mitnimmst, sollte das dem gesamtbetrag entsprechen. Und da jede Belegzeile nur einmal auftaucht, gibts auch keine Probleme mit den Summen.
Alternativ: Die Summe in einer eigenen Abfrage ausrechen.
Alternativ: Anzahl Belegzeilen ermitteln und den Gesamtbetrag jeweils durch die Anzahl Belegzeilen teilen und dann aufsummieren.
Gibt sicherlich noch weitere Varianten wenn man etwas Kreativität hat.
AndreasHoster
AndreasHoster 06.08.2009 um 09:47:10 Uhr
Goto Top
So wirst Du es NIE bekommen. Nicht mit Select Anweisungen.
Bei Select ist jede Zeile gleichberechtigt, es gibt beim Join keine erste oder zweite Zeile, die man dann anders behandeln könnte.
Budda
Budda 06.08.2009 um 10:21:03 Uhr
Goto Top
Hm ok, das mit dem Belegzeilen ermitteln wäre nen Weg. Beträge pro Belegzeile hab ich leider nicht.
Hab das mal versucht einzubauen, aber irgendwie will das nicht:

Select K.Belegnr, K.Gesamtbetrag, Z.Artikel, Z.Menge, Gesamtbetrag / Count(K.Belegnr) AS Summe FROM Belegkopf K INNER JOIN Belegzeilen Z ON K.id = Z.parentid

Der Plan war es eine zusätzliche Spalte anzufügen um die dann im Excel Summieren zu können. Aber so gehts nicht ^^
db-wizard
db-wizard 06.08.2009 um 10:33:26 Uhr
Goto Top
Hallo,


hast du es schon mal mit UNION versucht ? Btw, welche Datenbank verwendest du ?


Gruss
Budda
Budda 06.08.2009 um 10:50:42 Uhr
Goto Top
SQL Server2005

UNION? Ich versteh nicht worauf du hinaus willst. Mit Union Füge ich doch 2 Tabellen zusammen mit den gleichen Spalten. Was ja hier nicht gegeben ist.
AndreasHoster
AndreasHoster 06.08.2009 um 11:21:58 Uhr
Goto Top
Natürlich will das nicht. Aggregatfunktionen können nicht einfach so mit normaler Ausgabe kombiniert werden.

Aber probiers mal mit einer Unterabfrage:
Select K.Belegnr, K.Gesamtbetrag, Z.Artikel, Z.Menge, Gesamtbetrag / t.Anzahl AS Summe FROM Belegkopf K, (Select Belegnr, count(Belegnr) from Belegkopf) as t INNER JOIN Belegzeilen Z ON K.id = Z.parentid, K.BELEGNR = t.BELEGNR
db-wizard
db-wizard 06.08.2009 um 11:22:28 Uhr
Goto Top
Du selektierst zuerst dein kopf, fügst per UNION deine Belegzeilen dazu....

In ORACLE würde sich noch folgende Möglichkeit ergeben :

SELECT belegnr, SUM (preis*menge) OVER (PARTITION BY belegnr) AS Gesamtpreis, artikel ,menge
FROM(
SELECT a.belegnr, 0 AS gesamtbetrag, a.artikel, a.preis , menge
FROM belegzeilen a)

(Dies rechnet den Gesamtpreis halt jeweils aus den Bestellpositionen )

-->

BELEGNR GESAMTPREIS ARTIKEL MENGE
----------- ---------- -----
100 44 Kartoffeln 2
100 44 Käse 5
200 108 Kartoffeln 8
200 108 Fleisch 9
300 4 Messer 1


Gruss

(Gibt es in diesem Forum eigentllich auch eine Möglichkeit, Code zu formatieren ???)
Budda
Budda 06.08.2009 um 12:49:10 Uhr
Goto Top
Alles klar, habs hinbekommen. Danke für eure hilfe face-smile
db-wizard
db-wizard 06.08.2009 um 12:52:39 Uhr
Goto Top
...und wie hast du es hinbekommen ?


gruss