Toon posts:

[MYSQL] Totalen ophalen met SUM() geeft een foutmelding*

Pagina: 1
Acties:
  • 128 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

ik ben nu al de hele avond bezig met wat sql queries maar ik kom er niet meer uit

Dit is wat ik nu al heb.

[sql]
SELECT klanten.id, klanten.naam FROM klanten
LEFT JOIN facturen ON facturen.klant_id=klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
[/sql]

factuur_regels
factuur_id integer primary
bruto decimal
korting decimal
aantal decimal

facturen
id integer primary auto_increment
klant_id integer
bedrag_voldaan decimal

klanten
id integer primary auto_increment
naam varchar

Nu wil ik graag alle klanten in een lijst laten zien met de het id, naam, het totale bedrag_voldaan, en het totale bedrag van alle factuur_regels van de bijhorende facturen.

Maar zodra ik een SUM erin doe dan krijg ik errors en ik weet niet hoe ik dat moet oplossen. Dus als iemand een oplossing weet. _/-\o_

Groetjes

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
is dit iets?

SQL:
1
2
3
4
5
SELECT klanten.id, facturen.id, 
SUM((factuur_regels.bruto - factuur_regels.korting) * factuur_regels.aantal) AS totaal 
FROM klanten, facturen, factuur_regels 
WHERE klanten.id = facturen.klant_id
GROUP BY klanten.id, facturen.id, totaal;

Always shoot for the moon. Even if you miss you will land among the stars...


  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Post je query met SUM er ook ff bij van hoe jij denkt dat het moet!!

Oh ja en een duidelijk topic title helpt ook :)

[ Voor 29% gewijzigd door Valor op 16-01-2006 00:27 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Voorkauwen is nooit iets.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
Oh ja en een duidelijk topic title helpt ook :)
Ja oeps, maar je kan dit later niet aanpassen ofwel?

  • seamus21
  • Registratie: December 2001
  • Laatst online: 24-02-2018
Mijn vraag was aan de TS bedoeld. Daarnaast weet ik geeneens zelf of het werkt. Net ff vlug bedacht. Ben eigenlijk wel benieuwd.

'nooit' is ook niet handig om te gebruiken. Maar jah ik zie het dus niet als voorkauwen. Als ik dat bedoelde dan had ik het er wel bij vermeld.

Always shoot for the moon. Even if you miss you will land among the stars...


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Je geeft een volledig antwoord, of je het nou wel of niet zo bedoelt, of het nou wel of niet werkt.

Wat is er gebeurd met "iemand op weg helpen" ... welja, whatever ...

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
seamus21 schreef op maandag 16 januari 2006 @ 00:26:
is dit iets?

SQL:
1
2
3
4
5
SELECT klanten.id, facturen.id, 
SUM((factuur_regels.bruto - factuur_regels.korting) * factuur_regels.aantal) AS totaal 
FROM klanten, facturen, factuur_regels 
WHERE klanten.id = facturen.klant_id
GROUP BY klanten.id, facturen.id, totaal;
Volgens mij werkt dit niet. Ik wil namelijk een lijst hebben met alle klanten.

Daarnaast wil ik het totale factuur bedrag van die klanten erachter hebben staan.

Dus ID, NAAM, Totale bedrag, Totale voldaan bedrag

Waarbij
ID en NAAM direct uit de tabel klanten komt
Totale voldaan bedrag is een SUM van alle facturen.bedrag_voldaan
een een totaal overzicht van het totale bedrag wat door die klant is gedaan.
Dus: (bruto-korting)*aantal van alle factuurregels waar het factuurid een id is uit de tabel facturen met klantid.

Daarom moet ik joins gebruiken volgens mij

Sorry maar beter kan ik het ook niet uitleggen.

Alvast bedankt voor de reacties!!!!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Wat heb je zelf al geprobeerd?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Dat wil ik ook wel eens weten. ;) dada128: ik lees in je topicstart vrij weinig terug over wat je al geprobeerd hebt, en wat je precieze foutmelding is. Kun je misschien iets uitgebreider zijn over de opties die je al gehad hebt en wat er precies fout gaat? :)
Verwijderd schreef op maandag 16 januari 2006 @ 00:33:
Ja oeps, maar je kan dit later niet aanpassen ofwel?
Nope, jij niet, maar ik wel. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
SQL:
1
2
3
SELECT klanten.id, klanten.naam FROM klanten
LEFT JOIN facturen ON facturen.klant_id=klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id


Dit heb is mij zelf al wel gelukt, hoewel dit standaard is. Zodra ik alleen een SUM erbij doen dan geeft hij errors
SQL:
1
2
3
SELECT klanten.id, klanten.naam SUM(factuur_regels.bedrag_voldaan) FROM klanten
LEFT JOIN facturen ON facturen.klant_id=klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id


#1064 - Er is iets fout in de gebruikte syntax bij 'SUM(factuur_regels.bedrag_voldaan) FROM klanten
LEFT JOIN factu' in regel 1


En dit is volgens mij wel vrij basic om alleen het openstaande bedrag op te tellen

[ Voor 3% gewijzigd door Verwijderd op 16-01-2006 00:49 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je moet een komma voor SUM hebben. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Dom foutje maar met comma krijg ik dit
#1054 - Onbekende kolom 'factuur_regels.bedrag_voldaan' in field list.

Ik heb ook geprobeerd iets te doen met having maar dat lukte ook niet

[ Voor 30% gewijzigd door Verwijderd op 16-01-2006 00:50 ]


  • BARO
  • Registratie: Mei 2003
  • Laatst online: 18-11-2025
Verwijderd schreef op maandag 16 januari 2006 @ 00:50:
Dom foutje maar met comma krijg ik dit
#1054 - Onbekende kolom 'factuur_regels.bedrag_voldaan' in field list.

Ik heb ook geprobeerd iets te doen met having maar dat lukte ook niet
dan bestaat dat veld dus niet..

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Nogal wiedes, aangezien bedrag_voldaan volgens jouw eigen datastructuur in de tabel 'facturen' staat? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
BARO schreef op maandag 16 januari 2006 @ 00:51:
[...]


dan bestaat dat veld dus niet..
Weer een dom foutje moest zijn facturen.bedrag_voldaan
maar dan krijg ik dit waar ik de hele tijd op vast loop

#1140 - Het mixen van GROUP kolommen (MIN(),MAX(),COUNT()...) met no-GROUP kolommen is foutief indien er geen GROUP BY clausule is

Verwijderd

Topicstarter
SQL:
1
2
3
4
5
SELECT klanten.id, klanten.naam, SUM( facturen.bedrag_voldaan )
FROM klanten
LEFT JOIN facturen ON facturen.klant_id = klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
GROUP BY klanten.id


zodra ik er een group by bij gooi als bovenstaand dan kloppen de waardes helemaal niet dan berekend hij 2x de facturen.bedrag_voldaan

Verwijderd

Misschien moet je eens beginnen met je foutmeldingen te lezen. Daar staat toch echt wat er bedoelt wordt.

Edit:
Heel goed dat je iets gedaan hebt met de foutmelding.
Je zegt dat je niet het juiste bedrag eruit krijgt, maar 2x het gewenste bedrag?

-- Wat hier stond was onmogelijk :X --

[ Voor 71% gewijzigd door Verwijderd op 16-01-2006 01:06 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Ok ik ben er denk ik wel uit

Dit is dus de code geworden, nu nogal basic maar dit kan ik goed uitbouwen...

Misschien hebben jullie nog optimalisatie tips :P

SQL:
1
2
3
4
5
SELECT klanten.id, klanten.naam, SUM( facturen.bedrag_voldaan / 2 ) , SUM(factuur_regels.bruto) 
FROM klanten
LEFT JOIN facturen ON facturen.klant_id = klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
GROUP BY klanten.id,klanten.naam



_/-\o_

[ Voor 7% gewijzigd door Verwijderd op 16-01-2006 01:21 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Als je er nu ook nog eens aliassen van maakt, dan kun je er vanuit je applicatie ook makkelijker aankomen. Dus in plaats van dit:
SQL:
1
SELECT SUM(blaat) FROM ...

gebruik je dit:
SQL:
1
SELECT SUM(blaat) AS sum_blaat FROM ...

Vanuit bijvoorbeeld PHP betekent dit dat je het veld direct aan kan spreken met de naam sum_blaat in plaats van een index. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Dit is mijn eigen optimalisatie, AS en format om het netjes weer te geven :P

SQL:
1
2
3
4
5
SELECT klanten.id, klanten.naam, FORMAT( SUM( facturen.bedrag_voldaan /2 ) , 2 ) AS totaalvoldaan, FORMAT( SUM( factuur_regels.aantal * ( factuur_regels.bruto - ( factuur_regels.bruto /100 * factuur_regels.korting ) ) ) , 2 ) AS totaal
FROM klanten
LEFT JOIN facturen ON facturen.klant_id = klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
GROUP BY klanten.id, klanten.naam

  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Als je echt je query maken is het prettig als je weet wat je query doet. Ik maak de wat lastigere query meestal in het onderstaande programma. Als je dan het keyword EXPLAIN helemaal voor aan je query ziet laat die programme ziet wat de query allemaal doet. Ideaal voor optimalisatie!

Mysql Query Browser
http://dev.mysql.com/downloads/query-browser/

  • WormLord
  • Registratie: September 2003
  • Laatst online: 30-03 16:26

WormLord

Devver

Verwijderd schreef op maandag 16 januari 2006 @ 00:56:
SQL:
1
2
3
4
5
SELECT klanten.id, klanten.naam, SUM( facturen.bedrag_voldaan )
FROM klanten
LEFT JOIN facturen ON facturen.klant_id = klanten.id
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
GROUP BY klanten.id


zodra ik er een group by bij gooi als bovenstaand dan kloppen de waardes helemaal niet dan berekend hij 2x de facturen.bedrag_voldaan
Ik kan het mis hebben, maar komt dit niet doordat je meerdere (2) factuur-regels per factuur hebt?
Als je die join van factuur_regels weghaald of het factuur_id toevoegd in je GROUP BY, zou het wel moeten kloppen.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

WormLord schreef op maandag 16 januari 2006 @ 07:42:
[...]


Ik kan het mis hebben, maar komt dit niet doordat je meerdere (2) factuur-regels per factuur hebt?
Als je die join van factuur_regels weghaald of het factuur_id toevoegd in je GROUP BY, zou het wel moeten kloppen.
Volgens mij komt het omdat hij klanten.naam niet in zijn GROUP BY meeneemt, terwijl die wel in z'n SELECT clause staat. Waarom MySQL deze query nog wil uitvoeren is mij dan weer een raadsel.
De JOINs kloppen daar gewoon.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

kenneth schreef op maandag 16 januari 2006 @ 07:44:
Volgens mij komt het omdat hij klanten.naam niet in zijn GROUP BY meeneemt, terwijl die wel in z'n SELECT clause staat. Waarom MySQL deze query nog wil uitvoeren is mij dan weer een raadsel.
De JOINs kloppen daar gewoon.
Dat tovert er echt niet ineens records bij. De join's wel, of ze nou wel of niet correct zijn.

[ Voor 5% gewijzigd door ACM op 16-01-2006 07:58 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Wat maakt MySQL er eigenlijk wel van? Impliciet een group by?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17-04 19:03

Dido

heforshe

WormLord schreef op maandag 16 januari 2006 @ 07:42:
Ik kan het mis hebben, maar komt dit niet doordat je meerdere (2) factuur-regels per factuur hebt?
Scherp op de vroege ochtend :)
Ik zou inderdaad sowieso *nooit* een schijnbaar random "/2" in een query vertrouwen.

Wat betekent mijn avatar?

Pagina: 1