Anzeige - [Hier werben / Mediadaten]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
Diskussion

[mySQL] Summen-Problem

TSc
Geschrieben am: Do 26.03.2009, 22:15
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Hi!

Ich beiss mir grade an einem Problem die Zähne aus, vielleicht hat einer von euch eine Idee.

Also, ich habe zwei Tabellen, eine mit Buchungen und eine, in der Teilsummen einer Buchung verschiedenen Zwecken zugeordnet werden.

Jetzt frage ich ab, welche Buchungen noch nicht komplett mit Teilsummen von Zwecken begründet ist.
Bei 1000 Buchungen klappt es, nur bei zwei sagt er mir das die Summe der Zweckbeträge ungleich des Betrags der Buchung ist – und gibt aber zwei identische Beträge aus!

CODE

SELECT bu.buchungsID
FROM buchung bu
LEFT JOIN zweck zw
ON bu.buchungsID = zw.buchungsID
GROUP BY bu.buchungsID
HAVING sum( zw.wert ) <> max( bu.wert )



buchungsID...wert........zweckID...wert
12.................-34.99....94............-15.00
12.................-34.99....95............-19.99

Die wert-Felder sind beide decimal(10,2) .

Hat jemand eine Idee?

Danke & Gruß,
Tom


--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
 
Jürgen Auer
Server-Daten - Online-CRM-Lösungen
#2 Geschrieben am: Do 26.03.2009, 22:43 (+00:27)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 3276
Mitglied seit: 4.02.2006


Die zwei Zeilen machen mir kein Problem, das muß ja so sein. Wenn zwei Zwecke derselben Buchung zugeordnet sind, die Summe aber nicht dieselbe ist und alles zu dieser Buchung gelistet wird, dann kommen per Join zwei Zeilen raus.

Irritierender finde ich, daß -15.00 - 19.99 = -34.99 ist, die Summe der Zwecke also gleich dem Gesamtwert - damit dürfte die Buchung 12 gar kein Problem (= keine Zeile) produzieren, müßte also von der Having-Klausel ausgesiebt werden.

Nimm mal das Ergebnis der folgenden Abfrage

QUOTE
SELECT bu.buchungsID, bu.wert, zw.wert
FROM buchung bu LEFT JOIN zweck zw
ON bu.buchungsID = zw.buchungsID


zur Kontrolle.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

Server-Daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
Maik
contaxe AG
#3 Geschrieben am: Fr 27.03.2009, 01:32 (+02:49)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 520
Mitglied seit: 16.03.2006


kommt vielleicht daher, dass er die Dezimalwerte beim Rechnen(Summieren) in eine IEEE 754 Gleitkommazahl umwandelt, und die resultierende Summe daher eine andere Präzision hat. Anders könnte ich mir das nicht erklären.

Wenn du MySQL >=5.0 verwendest, kannst du ja mal das probieren:

CODE

SELECT bu.buchungsID
FROM buchung bu
LEFT JOIN zweck zw
ON bu.buchungsID = zw.buchungsID
GROUP BY bu.buchungsID
HAVING CAST( sum( zw.wert ) as DECIMAL(10,2) ) <> max( bu.wert )


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
TSc
#4 Geschrieben am: Fr 27.03.2009, 06:20 (+04:48)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


QUOTE (Jürgen Auer @ Do 26.03.2009, 22:43)
Irritierender finde ich, daß -15.00 - 19.99 = -34.99 ist, die Summe der Zwecke also gleich dem Gesamtwert - damit dürfte die Buchung 12 gar kein Problem (= keine Zeile) produzieren, müßte also von der Having-Klausel ausgesiebt werden.


Genau das Problem meinte ich.

Das die zwei Zeilen aus dem Join resultieren war mir klar, ich meinte das ich neben Buchung 12 noch eine Buchung habe bei der das Problem auftritt.

CODE
SELECT bu.buchungsID, sum( zw.wert ) , max( bu.wert )
hatte ich schon zur Kontrolle, hier kam für beide Werte die gleiche Zahl raus. Was mich dann in Zusammenhang mit dem <> - Vergleich richtig stutzig gemacht hat.


Danke für den Vorschlag Maik, ich habe auch überlegt das es in diese Richtung gehen könnte, kam aber nicht drauf wie ich das regeln kann. Ich werde deinen Vorschlag ausprobieren wenn ich heute Abend wieder zu Hause bin.


--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
Jürgen Auer
Server-Daten - Online-CRM-Lösungen
#5 Geschrieben am: Fr 27.03.2009, 12:06 (+05:45)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 3276
Mitglied seit: 4.02.2006


Ich hatte noch als Verdacht, daß es einen zusätzlichen Eintrag in der Zweck-Tabelle mit derselben BuchungsId, aber Null-Betrag geben könnte, der zu irgendeiner Pathologie führt. Deshalb die Kontrollausgabe aller Werte.

Der Vorschlag von Maik müßte an einer Stelle modifiziert werden:

QUOTE
CAST(sum(zw.wert) as DECIMAL(10,2)) <> Sum(Cast(zw.wert as Decimal(10,2)))


Denn

QUOTE
Cast(10.004 + 10.004 as Decimal(10,2)) = 20.01
<> 20.00 = Cast(10.004 as Decimal(10,2)) + Cast(10.004 as Decimal(10,2))


Allerdings würde ich explizit runden.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

Server-Daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
Alonso
WEPAX.com
#6 Geschrieben am: Fr 27.03.2009, 16:35 (+04:28)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 622
Mitglied seit: 10.02.2005


Hmm, du gruppierst nach Buchungen, machst aber via left join die Summen aus dem "Zweck".

Mach doch mal zum Test folgendes;
CODE
GROUP BY bu.buchungsID, zw.buchungsID


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
Alonso
WEPAX.com
#7 Geschrieben am: Fr 27.03.2009, 16:45 (+00:09)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 622
Mitglied seit: 10.02.2005


Btw; Welche mySQL-Version und Engine verwendest du?
Habe das ganze hier (Version: 5.1.32-0.dotdeb.1) kurz nachgebaut. Dein Query liefert bei myISAM und InnoDB 0 Zeilen zurück;

Repariere sonst mal die Indexe (sofern hoffentlich vorhanden)






--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
TSc
#8 Geschrieben am: Fr 27.03.2009, 22:02 (+05:17)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Die Serverversion ist 5.0.32 und die Tabellen laufen auf myISAM.
Auch nach einer Reperatur ändert sich nichts, leider.

Hier der Test:
CODE

SELECT bu.buchungsID, sum( zw.wert ) , max( bu.wert )
FROM hhb_buchung bu
LEFT JOIN hhb_zweck zw ON bu.buchungsID = zw.buchungsID
GROUP BY bu.buchungsID, zw.buchungsID
HAVING sum( zw.wert ) <> max( bu.wert )


buchungsID...... sum( zw.wert )......max( bu.wert )
12....................-34.99...................-34.99
500.................. 2561.78................2561.78




Bei
CODE
CAST(sum(zw.wert) as DECIMAL(10,2)) <> Sum(Cast(zw.wert as Decimal(10,2)))

und
CODE
CAST( sum( zw.wert ) as DECIMAL(10,2) ) <> max( bu.wert )

als HAVING sagt er mir:
QUOTE

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECIMAL(10,2)) <> Sum(Cast(zw.wert as Decimal(10,2)))


Ich schau mal ob ich finde was ihn stört...


--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
Jürgen Auer
Server-Daten - Online-CRM-Lösungen
#9 Geschrieben am: Fr 27.03.2009, 22:11 (+00:08)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 3276
Mitglied seit: 4.02.2006


Da fehlen Klammern biggrin.gif

Kommt dabei raus, wenn man das bloß tippt und nicht testet.


Nee, sorry, fehlen doch keine Klammern - sollte schon richtig zählen.

Der nächste Kandidat ist, daß jeder Ausdruck in der Having-Klausel auch unter Group By aufgeführt werden muß.

Teste zunächst per reiner Select-Abfrage, ob Cast bzw. Cast ... as Decimal(10,2)) funktioniert.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

Server-Daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
TSc
#10 Geschrieben am: Fr 27.03.2009, 22:30 (+00:18)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Die Klammern habe ich auch zuerst gezählt. smile.gif
Erfahrung prägt.

Es scheint der Cast selber zu sein.
Mal sehen ob ich ein Handbuch zu 5.0.32 finde.



--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
Jürgen Auer
Server-Daten - Online-CRM-Lösungen
#11 Geschrieben am: Fr 27.03.2009, 22:37 (+00:07)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 3276
Mitglied seit: 4.02.2006


Tja - upgrade auf 5.1: Für 5.1 hatte ich ein CHM-Handbuch auf der Festplatte, da ist CAST mit drin.

Bei 5.0 ist der Begriff im Index - aber die Seite fehlt.

http://dev.mysql.com/doc/


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

Server-Daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
TSc
#12 Geschrieben am: Fr 27.03.2009, 22:43 (+00:06)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Ist auch da:
http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html

CAST an sich ist auch nicht das Problem, ich hab verschiedene Datentypen probiert und es klappt. Er streikt erst wenn DECIMAL ins Spiel kommt, obwohl es laut Handbuch unterstützt wird.
blink.gif

Edit:
Tja, und das ist dann auch die Lösung:
CODE

      select
        bu.buchungsID
       from
        hhb_buchung bu
       left join
        hhb_zweck zw
       on
        bu.buchungsID = zw.buchungsID
       group by
        bu.buchungsID
       having
        cast(sum(zw.wert) as char)<> cast(max(bu.wert) as char)


Vergleichen wir halt zwei fertig berechnete Strings wenn decimal nicht funktioniert. wink.gif
Getestet in mehreren Szenarien und funktioniert.

Vielen Dank für die Anregungen, ohne euch hätte ich das nie geschafft!


--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
Jürgen Auer
Server-Daten - Online-CRM-Lösungen
#13 Geschrieben am: Fr 27.03.2009, 22:59 (+00:16)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 3276
Mitglied seit: 4.02.2006


Dann multipliziere mal testweise mit 100 bzw. 10000, um zu sehen, welche Nachkommastellen da mitgeschleift werden.


Wenn allerdings die Online-Hilfe 5.0 Infos enthält und die CHM-Hilfe (die ja auch aus Html-Dateien generiert wird) diese Infos nicht enthält, dann sieht mir das doch noch nach einer 'Bananenimplementierung' aus (= eine, die erst reifen muß).

Auch daß das bei Alonso funktioniert, könnte ein Indiz dafür sein.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

Server-Daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
TSc
#14 Geschrieben am: Fr 27.03.2009, 23:09 (+00:10)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Ja, mit der Bananenimplementierung könntest du Recht haben.

Ich habs dann übrigens normal in der fehlerhaften Variante mit 10000000 multipliziert, aber auch da verrät er mir nicht wo er noch was mitschleift.
Vermutlich müsste ich dafür die Feldformate auf decimal(10,10) oder so anpassen damit er es rausrückt.

Na ja, so weit geht ich dann für ein Privatprojekt heute nicht mehr, erstmal funktioniert es ja jetzt.


--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
profo
#15 Geschrieben am: Sa 28.03.2009, 11:20 (+12:10)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 433
Mitglied seit: 19.01.2007


Bau doch mal testweise ein "sum(zw.wert)" ins SELECT ein, damit Du siehst, was bei der Summe wirklich rauskommt. Wahrscheinlich wird das sowas wie 34.990000001 sein... Vielleicht hilft da auch so etwas wie round(sum(zw.wert),2)

Ansonsten hätte ich noch den Tipp, komplett auf Integers umzustellen (also in Cent zu rechnen). Damit vermeidest Du die ganzen Fließkomma-Rundungsprobleme; die gibt es ja immer...
Top
PMEmail Poster
Top
 
TSc
#16 Geschrieben am: Sa 28.03.2009, 12:09 (+00:48)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Das war auch einer der spukigen Effekte. Ich hatte die Smme auch in der select ausgeben lassen - nach der zweiten Stelle war Schluss.
Vileicht sollte ich Mulder und Scully einschalten... cool.gif

Aber mit den Integern hast du recht, das wäre die sauberste Lösung.
Vieleicht mache ich das mal wenn ich viel Zeit habe.
Zur Zeit tut es das noch so für unser 2-Personen-Haushaltsbuch. wink.gif



--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
profo
#17 Geschrieben am: Sa 28.03.2009, 12:41 (+00:31)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 433
Mitglied seit: 19.01.2007


Für ein Haushaltsbuch? Ja... am falschen Ende gespart. Mit SAP wäre Dir das nicht passiert ;-)

Versuch es mal mit dem round(x,2) in der Summe. Ich vermute, damit erschlägst Du das Problem für den Moment.

Viele Grüße
Top
PMEmail Poster
Top
 
Maik
contaxe AG
#18 Geschrieben am: Sa 28.03.2009, 13:36 (+00:55)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 520
Mitglied seit: 16.03.2006


Wenn es ein Float problem ist, wird round nichts bringen. Denn das ist ganz alleine eine Sache der Computer internernen Darstellung von zahlen... Das einzige was ich mir noch Vorstellen könnte was funktionieren könnte, wäre den Rückgabewert von max() zu einem Float zu konvertieren also sowas:

CODE
select
       bu.buchungsID
      from
       hhb_buchung bu
      left join
       hhb_zweck zw
      on
       bu.buchungsID = zw.buchungsID
      group by
       bu.buchungsID
      having
      ( sum(zw.wert) + 1) <> ( max(bu.wert) + 1)


oder gleich so:


CODE
select
       bu.buchungsID
      from
       hhb_buchung bu
      left join
       hhb_zweck zw
      on
       bu.buchungsID = zw.buchungsID
      group by
       bu.buchungsID
      having
      ( sum(zw.wert) - max(bu.wert) ) <> 0


Der Trick dabei ist allerdings, den Optimizer von MySQL auszuhebeln... weiß nicht ob das 1.Beispiel das schafft.


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
TSc
#19 Geschrieben am: Sa 28.03.2009, 20:50 (+07:14)
Report PostQuote Post

AyomRank 7
**************

Gruppe: Member (aktiv)
Beiträge: 1122
Mitglied seit: 8.11.2004


Wie gesagt, die convertierung in ein varchar wie oben beschrieben hat das Problem gelöst.

Sauberer wäre es aber sicher wenn ich das decimal Feld der Tabelle bei Gelegenheit in Integer wandel und mit Cent arbeite.

Danke für eure Mühe!



--------------------
---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag.
2. Content ist King!

Ferienhaus in der Eifel
Top
PMEmail Poster
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/28897

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
MySQL Sortierung ist irgendwie komisch! webdoktor 249 13 Fr 5.03.2010, 10:20
MYSQL Update-Befehl auf Basis Erg. SELECT Abfrage? Claus Lehmann 197 4 Mi 3.03.2010, 12:27
Umlaut Problem mit php Felix Weber 398 13 Mo 1.03.2010, 08:59
Problem mit Adwords romeodadon 563 5 So 14.02.2010, 22:43
MySQL-Volltextsuche mit REGXP PH 196 10 Do 4.02.2010, 16:47
Programmierer (PHP/MySQL/JS) im Raum Dresden qwerket 233 2 Mo 1.02.2010, 12:11
mysql performance Felix Weber 297 8 Di 19.01.2010, 21:01
Abfrage einer MySQL Datenbank webdoktor 281 10 Fr 8.01.2010, 18:11
JS Problem Sancheck 149 1 Mi 6.01.2010, 12:58
Problem Marketing für 'grenzwertige Seiten& ... Jürgen Auer 258 2 Fr 1.01.2010, 22:49




Anzeige - [Hier werben / Mediadaten]



Anzeigen


[Hier werben / Mediadaten]