Diskussion
[mySQL] Summen-Problem
| TSc |
Geschrieben am: Do 26.03.2009, 22:15
|
||
![]() 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!
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 |
||
![]() |
| Jürgen Auer Server-Daten - Online-CRM-Lösungen |
#2 Geschrieben am: Do 26.03.2009, 22:43 (+00:27)
|
||
|
AyomRank 9 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
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. |
||
![]() |
| Maik contaxe AG |
#3 Geschrieben am: Fr 27.03.2009, 01:32 (+02:49)
|
||
![]() 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:
-------------------- |
||
![]() |
| TSc |
#4 Geschrieben am: Fr 27.03.2009, 06:20 (+04:48)
|
||||
![]() AyomRank 7 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 1122 Mitglied seit: 8.11.2004 |
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.
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 |
||||
![]() |
| Jürgen Auer Server-Daten - Online-CRM-Lösungen |
#5 Geschrieben am: Fr 27.03.2009, 12:06 (+05:45)
|
||||
|
AyomRank 9 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:
Denn
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. |
||||
![]() |
| Alonso WEPAX.com |
#6 Geschrieben am: Fr 27.03.2009, 16:35 (+04:28)
|
||
![]() 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;
-------------------- |
||
![]() |
| Alonso WEPAX.com |
#7 Geschrieben am: Fr 27.03.2009, 16:45 (+00:09)
|
![]() 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) -------------------- |
![]() |
| TSc |
#8 Geschrieben am: Fr 27.03.2009, 22:02 (+05:17)
|
||||||||
![]() 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:
buchungsID...... sum( zw.wert )......max( bu.wert ) 12....................-34.99...................-34.99 500.................. 2561.78................2561.78 Bei
und
als HAVING sagt er mir:
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 |
||||||||
![]() |
| Jürgen Auer Server-Daten - Online-CRM-Lösungen |
#9 Geschrieben am: Fr 27.03.2009, 22:11 (+00:08)
|
|
AyomRank 9 Gruppe: Experten Entwicklung Beiträge: 3276 Mitglied seit: 4.02.2006 |
Da fehlen Klammern
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. |
![]() |
| TSc |
#10 Geschrieben am: Fr 27.03.2009, 22:30 (+00:18)
|
![]() AyomRank 7 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Gruppe: Member (aktiv) Beiträge: 1122 Mitglied seit: 8.11.2004 |
Die Klammern habe ich auch zuerst gezählt.
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 |
![]() |
| Jürgen Auer Server-Daten - Online-CRM-Lösungen |
#11 Geschrieben am: Fr 27.03.2009, 22:37 (+00:07)
|
|
AyomRank 9 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. |
![]() |
| TSc |
#12 Geschrieben am: Fr 27.03.2009, 22:43 (+00:06)
|
||
![]() 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. Edit: Tja, und das ist dann auch die Lösung:
Vergleichen wir halt zwei fertig berechnete Strings wenn decimal nicht funktioniert. 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 |
||
![]() |
| Jürgen Auer Server-Daten - Online-CRM-Lösungen |
#13 Geschrieben am: Fr 27.03.2009, 22:59 (+00:16)
|
|
AyomRank 9 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. |
![]() |
| TSc |
#14 Geschrieben am: Fr 27.03.2009, 23:09 (+00:10)
|
![]() 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 |
![]() |
| profo |
#15 Geschrieben am: Sa 28.03.2009, 11:20 (+12:10)
|
![]() 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... |
![]() |
| TSc |
#16 Geschrieben am: Sa 28.03.2009, 12:09 (+00:48)
|
![]() 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... 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. -------------------- ---~~~ Meine zwei güldenen Regeln zu nachhaltigem SEO ~~~---
1. Google mag was der User mag. 2. Content ist King! Ferienhaus in der Eifel |
![]() |
| profo |
#17 Geschrieben am: Sa 28.03.2009, 12:41 (+00:31)
|
![]() 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 |
![]() |
| Maik contaxe AG |
#18 Geschrieben am: Sa 28.03.2009, 13:36 (+00:55)
|
||||
![]() 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:
oder gleich so:
Der Trick dabei ist allerdings, den Optimizer von MySQL auszuhebeln... weiß nicht ob das 1.Beispiel das schafft. -------------------- |
||||
![]() |
| TSc |
#19 Geschrieben am: Sa 28.03.2009, 20:50 (+07:14)
|
![]() 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 |
![]() |
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
![]() |
![]() ![]() ![]() |
| Themen Titel | Autor | Views | Antworten | Letzte Aktion |
| 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]


















