WinFuture-Forum.de: SQL-Query Probleme mit Join - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

SQL-Query Probleme mit Join SQL rechnet "wirres" Zeug!


#1 _der dom_

  • Gruppe: Gäste

geschrieben 15. Juli 2011 - 18:40

Guten Tag,

hab da ein kleines Problemchen mit einer SQL-Query.

Ich will aus 2 Tabellen Daten ziehen und diese dann in einem DGV (C#.net) ausgeben. Allerdings rechnet mir SQL da ziemlichen murks aus und ich bin schon mal dahinter gekommen, dass es defintiv an dem Join liegen muss.

Hier die Query:
SELECT SUM(tbl_Rechnungen.Betrag) AS Offen, SUM(tbl_buchungen.Betrag) AS Gezahlt, ROUND(AVG(tbl_Rechnungen.Betrag + tbl_buchungen.Betrag),2) AS Durchschnitt, tbl_Rechnungen.MitgliedsNr AS MitgliedsNr FROM tbl_Rechnungen JOIN tbl_Buchungen GROUP BY tbl_Rechnungen.MitgliedsNr ORDER BY Offen


Das Problem ist, dass er mir die beiden SUM mal die Anzahl der in tbl_Buchungen enthaltenen Buchungen nimmt.

Des weiteren zeigt er mir den selben Wert für "Gezahlt" bei allen Mitglieder an, was ja schonmal purer Unsinn ist.

Der Durchschnitt wird zwar auf Grund der ausgegebenen Summen richtig errechnet, allerdings stimmt dieser durch das Multiplizieren der netten SQL-Geschichte auch nicht mehr.

Hoffe es kann mir jemand helfen, ich wüsste nicht mehr wo ich noch ansetzen soll.

Grüße,

Dom
0

Anzeige



#2 Mitglied ist offline   UweKeim 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 08. Juli 11
  • Reputation: 1
  • Geschlecht:Männlich
  • Wohnort:Göppingen
  • Interessen:Software-Entwickeln ;-)

geschrieben 17. Juli 2011 - 21:50

Meiner Meinung nach "rechnet SQL" nicht falsch, sondern der Anwender geht von anderen Dingen aus, als sie tatsächlich sind :rofl:

Wenn Du Deine Frage in Englisch formulieren kannst, empfehle ich Dir http://dba.stackexchange.com/ oder die Hauptseite http://stackoverflow.com/ dort wirst Du auf jeden Fall eine Antwort bekommen.
0

#3 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.689
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 18. Juli 2011 - 16:43

SELECT SUM(tbl_Rechnungen.Betrag) AS Offen, SUM(tbl_buchungen.Betrag) AS Gezahlt,

das passt soweit mal
ROUND(AVG(tbl_Rechnungen.Betrag + tbl_buchungen.Betrag),2) AS Durchschnitt, tbl_Rechnungen.MitgliedsNr AS MitgliedsNr

versuch hier mal
 ROUND(avg(tbl_Rechnungen.Betrag)+avg(tbl_buchungen.Betrag)), 2 AS Durchschnitt,

FROM tbl_Rechnungen JOIN tbl_Buchungen GROUP BY tbl_Rechnungen.MitgliedsNr ORDER BY Offen

das passt auch wieder (theoretisch)

aber es hapert sicher am join, da sonst das problem mit den mitgliedern nicht wäre.

schreib mir mal den output von der query hier rein und einen dump von den beiden tabellen, dann tu ich mir schon leichter das ganze zu analysieren
0

#4 _der dom_

  • Gruppe: Gäste

geschrieben 18. Juli 2011 - 20:38

Hey,

danke euch beiden schonmal. Ich bin der ganzen Sache jetzt nochmal richtig auf den Grund gegangen. Zum einen war ein falscher FK gesetzt. Das hab ich korrigiert und die Query ein wenig abgeändert. Jetzt habe ich nur noch das Problem, dass die Spalte "Offen" anders berechnet wird. Das liegt aber wohl daran, dass er folgendes macht:

Bei 2 Zahlungseingangsbuchungen erfasst er direkt die Offenen Beträge mit.

Hier passiert das Unglück: Der Offene Betrag wird bei meiner Query wie folgt berechnet:

Buchung 1: Grundbetrag - Gezahlt -> das passt dann im Ergebnis nachher noch
Buchung 2: Restbetrag - Gezahlt -> Jetzt erhalte ich als Ergebnis: Grundbetrag-Gezahlt+Restbetrag-Gezahlt.

Das ist ja absoluter Quatsch.

Ein Output kann ich dir gerade nicht liefern weil ich die Anwendung auf meinem Stick an der Arbeit habe -.-

Die DB ist jetzt weitesgehend leer. Hab dir kompletten Dumb angehangen.

Angehängte Datei(en)


0

#5 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.689
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 18. Juli 2011 - 21:21

ich hab das gefühl dass da die queryidee nicht ganz passt

wenn ich die idee richtig verstanden hab bringt dich das weiter

SELECT tbl_Rechnungen.Betrag AS "Zu Zahlen", tbl_buchungen.Betrag AS Gezahlt, AVG(tbl_Rechnungen.Betrag - tbl_buchungen.Betrag) AS Offen, tbl_Rechnungen.MitgliedsNr AS MitgliedsNr FROM tbl_Rechnungen JOIN tbl_Buchungen GROUP BY tbl_Rechnungen.MitgliedsNr ORDER BY Offen


wenn nicht und du willst explizit alle einzelnen buchungen des spielers berechnen dann brauchst du ein having weil sich das having dann auf das gesamte resultset auswirkt

Dieser Beitrag wurde von Ludacris bearbeitet: 18. Juli 2011 - 21:25

0

#6 _der dom_

  • Gruppe: Gäste

geschrieben 19. Juli 2011 - 18:47

Hey, also das kommt der ganzen Sache schon sehr nahe.

Muss mir nur noch jetzt über die richtige Zuweisung gedanken machen. Aber das ist im Prinzip direkt auf DB Ebene.

Können uns aber diesbezüglich gerne per MSN austauschen.

Edit:

Das Problem ist noch immer nicht gelöst!

Ich bekomme zwar eine korrekte Rechnung, allerdings muss ich es Mitgliedsspezifisch haben. Die Query ist nicht nur für eine Übersicht die dazu dient alle gegenüber auszuwerten sondern auch dazu, dass ich die einzelnen Beträge gescheit ausgegeben bekomme.

Ich hab nur echt keine Ahnung mehr wie ich das noch hinbekommen soll.....

Dieser Beitrag wurde von der dom bearbeitet: 19. Juli 2011 - 20:48

0

#7 Mitglied ist offline   hartex 

  • Gruppe: Mitglieder
  • Beiträge: 6
  • Beigetreten: 09. Februar 05
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 21. Juli 2011 - 00:29

Versuchs mal damit ;)

SELECT r.MitgliedsNr AS Mitglied, 
  (SELECT ROUND(SUM( r.Betrag ),2)
  FROM tbl_rechnungen AS r
  WHERE r.MitgliedsNr = Mitglied
  ) AS Offen, 
ROUND(SUM( b.Betrag ),2) AS Gezahlt, 
ROUND( AVG( r.Betrag + b.Betrag ) , 2 ) AS Durchschnitt
FROM tbl_buchungen AS b
LEFT JOIN tbl_rechnungen AS r ON r.MitgliedsNr = b.MitgliedsNr
GROUP BY b.MitgliedsNr
ORDER BY Offen


1

#8 Mitglied ist offline   MarWil 

  • Gruppe: aktive Mitglieder
  • Beiträge: 24
  • Beigetreten: 22. März 06
  • Reputation: 0

geschrieben 22. Juli 2011 - 08:08

SELECT 
ROUND((SUM( tbl_Rechnungen.Betrag )-SUM( tbl_buchungen.Betrag )),2) AS Offen, 
ROUND(SUM( tbl_buchungen.Betrag ),2) AS Gezahlt, 
ROUND( AVG( tbl_Rechnungen.Betrag + tbl_buchungen.Betrag)  , 2 ) AS Durchschnitt, 
tbl_Rechnungen.MitgliedsNr AS MitgliedsNr
FROM tbl_Rechnungen JOIN tbl_Buchungen 
ON tbl_Rechnungen.mitgliedsnr = tbl_Buchungen.mitgliedsnr
group by mitgliedsnr
ORDER BY Offen


0

#9 _der dom_

  • Gruppe: Gäste

geschrieben 22. Juli 2011 - 21:06

Hey,

also Hartex Antwort hat mich noch einen Tick weiter gebracht. ich versuch das jetzt noch alles zu implementieren und melde mich dann wieder wenn es so ist wie ich es gerne hätte.

Besten Dank schonmal.

@MarWil. Deine Ausgaben passen soweit auch nur die der Offenen Beträge nicht. Die sind genauso wirre wie die von mir. Wobei du da wahrscheinlich auch nichts zu kannst.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0