[SQL] SUM geeft verkeerde waarde

Pagina: 1
Acties:

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

Topicstarter
Ik heb een klein factuur systeempje, en die kan oa. wat totalen genereren, 1 van de queries is bv. het totaal aantal verkochte producten in een bepaalde maand, van een bepaalde leverancier.
Hiervan willen we dan totaal aantal verkochte producten, totale inkoop, totale verkoop etc.

Beetje gesnoeid in de layout, hopelijk is het leesbaar:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$q = "
SELECT
    A_Producten.ProductID as product_id, A_Producten.Productnaam as product_naam,
    
    SUM(
        IF(
            LOCATE('FV',A_Bestellingen.Status),
            A_Bestellingproducten.Productaantal,
            0
            )
        ) as product_aantal_maal_besteld,
    SUM(
        IF(
            LOCATE('FV',A_Bestellingen.Status),
            A_Bestellingproducten.Productaantal,
            0
            ) * A_Bestellingproducten.Productverkoop
        ) as product_verkoop_totaal,
    SUM(
        IF(
            LOCATE('FV',A_Bestellingen.Status),
            A_Bestellingproducten.Productaantal,
            0
            ) * IF(
                    A_Producten.Productvaluta = 'perc' ,
                    A_Bestellingproducten.Productverkoop * A_Producten.Productinkoop / 100,
                    A_Producten.Productinkoop
                    )
        ) as product_inkoop_totaal,
    A_Crediteuren.Bedrijfsnaam as product_crediteur_bedrijfsnaam, A_Bestellingen.Status as bestelling_status
FROM
    A_Producten
LEFT JOIN
    A_Bestellingproducten ON (A_Bestellingproducten.ProductID = A_Producten.ProductID)
LEFT JOIN
    A_Bestellingen ON (A_Bestellingproducten.BestellingID = A_Bestellingen.BestellingID)
LEFT JOIN
    A_Crediteuren ON (A_Crediteuren.CrediteurID = A_Producten.CrediteurID)
WHERE
    !A_Producten.Deleted
    AND A_Producten.CrediteurID = ".(int)$crediteurid."
    AND FROM_UNIXTIME(A_Bestellingen.Datum,'%m') = '". 
                date('m',mktime(0, 0, 0, $date[0], 1, $date[1])) ."'
    AND FROM_UNIXTIME(A_Bestellingen.Datum,'%Y') = '". 
                date('Y',mktime(0, 0, 0, $date[0], 1, $date[1])) ."'
GROUP BY
    A_Producten.ProductID
ORDER BY
    A_Producten.Productnaam ASC";


De LOCATE('FV',...) is bedoeld om alleen de bestellingen mee te rekenen waar de Factuur Verzonden is.

De uitkomst hiervan is dus niet correct. De product_aantal_maal_besteld is 1 (moet 3 zijn), de product_inkoop_totaal is slechts 1 van de 3 records - maar de product_verkoop_totaal is wel correct!

I don't get it 8)7

Klaar voor een nieuwe uitdaging.


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Is één van de waarden van Productaantal van de gegroepeerde records toevallig 1? Verander ze dan voor de grap allemaal in verschillende waarden (anders dan 1) en kijk welke hij pakt.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

bigtree schreef op 28 July 2003 @ 11:56:
Is één van de waarden van Productaantal van de gegroepeerde records toevallig 1? Verander ze dan voor de grap allemaal in verschillende waarden (anders dan 1) en kijk welke hij pakt.
Dat lost het probleem natuurlijk niet op omdat een sum ze allemaal zou moeten pakken ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Creepy schreef op 28 July 2003 @ 11:58:
[...]

Dat lost het probleem natuurlijk niet op omdat een sum ze allemaal zou moeten pakken ;)
Wat ik vermoed is dat MySQL het veld als een string ziet en alleen de eerste pakt. Zie punt 9 uit de categorie 'weird behaviour' van ACM's lijstje.

[ Voor 4% gewijzigd door bigtree op 28-07-2003 12:09 ]

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

Topicstarter
Na errrg lang kloten heeft het probleem zichzelf opgelost: een dubbel gecrediteerd product (-1 * -bedrag) resulteerde in wat ongein met inkoop cijfers etc. :)

bedankt voor de hulp :P

Klaar voor een nieuwe uitdaging.


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
En ik dacht nog wel dat het een bug in MySQL was... balen! ;)

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1