[sql] SUM AS

Pagina: 1
Acties:

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
Dit is mijn query

SQL:
1
2
3
4
5
6
SELECT
facturen.id, facturen.datum,
SUM(factuur_regels.bruto+(factuur_regels.bruto/100*factuur_regels.korting)*factuur_regels.aantal) AS totaalbedrag
FROM facturen LEFT JOIN factuur_regels ON facturen.id=factuur_regels.factuur_id
WHERE facturen.klant_id=00001 AND facturen.bedrag_voldaan=totaalbedrag
GROUP BY factuur_regels.factuur_id


Nu is het zo dat als ik deze invoer hij totaalbedrag niet kent maar deze heb ik toch met AS totaalbedrag al gedefinieerd?

Hopelijk kan iemand mij even een tip geven hoe ik dit goed moet definiëren

Inside The Matrix, they are everyone, and they are no one.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
voer hem eens in in phpmyadmin, krijg je wel rows terug?
doet ie het wel met simpelere query?

probeer eens wat, en post eens waar het PRECIES op fout gaat, wij kunnen wel alles voor je debuggen, maar dit moet je ook zelf kunnen.

kijk eens naar je group by.. want ik weet niet welke DBMS je gebruikt maar wat je nu doet is iig fout

offtopic:
trouwens, probeer eens [code=sql][/code] om je query te zetten in dit forum, dan krijg je iets leesbardere text

[ Voor 16% gewijzigd door BasieP op 16-12-2005 18:21 ]

This message was sent on 100% recyclable electrons.


  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
BasieP schreef op vrijdag 16 december 2005 @ 18:19:
voer hem eens in in phpmyadmin, krijg je wel rows terug?
doet ie het wel met simpelere query?

probeer eens wat, en post eens waar het PRECIES op fout gaat, wij kunnen wel alles voor je debuggen, maar dit moet je ook zelf kunnen.

offtopic:
trouwens, probeer eens [code=sql][/code] om je query te zetten in dit forum, dan krijg je iets leesbardere text
Hij zegt dat hij totaalbedrag niet kent maar deze heb ik toch al gedefinieerd via
AS totaalbedrag
of bedrijp ik dit verkeerd hij loop namelijk hierop vast
AND facturen.bedrag_voldaan = totaalbedrag
dus mijn vraag is ook hoe moet ik totaalbedrag nu definiëren?

Inside The Matrix, they are everyone, and they are no one.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

In een query worden de tabellen uit de from clausule beperkt en aan elkaar gelegd zoals in de where (en join) clausule staat.
Daarna wordt gegroepeerd zoals in de group by, daarna komt pas hetgeen in de select staat.

In de where refereer jij naar een kolom in de select, maar dat gegeven is dan nog niet bekend.

Who is John Galt?


  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
justmental schreef op vrijdag 16 december 2005 @ 18:24:
In een query worden de tabellen uit de from clausule beperkt en aan elkaar gelegd zoals in de where (en join) clausule staat.
Daarna wordt gegroepeerd zoals in de group by, daarna komt pas hetgeen in de select staat.

In de where refereer jij naar een kolom in de select, maar dat gegeven is dan nog niet bekend.
Dus als ik het goed begrijp is het nu zo dat het met mysql niet kan?

Inside The Matrix, they are everyone, and they are no one.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
gooi sowieso 'facturen.datum' even in je 'order by' clause, want zoals je het nu hebt is het geen valid sql.

mm ik denk dat je het moet proberen met having..

dus
SQL:
1
HAVING facturen.bedrag_voldaan=totaalbedrag
achter je GROUP BY

edit:
moet je natuurlijk wel 'facturen.bedrag_voldaan' bij je group by toevoegen, anders kan die daar niet mee werken

[ Voor 38% gewijzigd door BasieP op 16-12-2005 18:28 ]

This message was sent on 100% recyclable electrons.


  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
Ok dit heb ik nu

SQL:
1
2
3
4
5
6
7
SELECT facturen.id, facturen.datum, SUM( factuur_regels.bruto + ( factuur_regels.bruto /100 * factuur_regels.korting ) * factuur_regels.aantal ) AS totaalbedrag
FROM facturen
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
WHERE facturen.klant_id =00001
ORDER BY facturen.datum
GROUP BY factuur_regels.factuur_id, facturen.bedrag_voldaan
HAVING facturen.bedrag_voldaan=totaalbedrag


maar nu zegt hij:
Er is iets fout in de gebruikte syntax bij 'GROUP BY factuur_regels.factuur_id, facturen.bedrag_voldaan
HAV' in regel 6

[ Voor 12% gewijzigd door clooner op 16-12-2005 18:40 ]

Inside The Matrix, they are everyone, and they are no one.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
sinds wanneer kan je eerst order by doen en daarna group by? volgens mij hoort dat andersom

(waarom heb je het sowieso toegevoegd, als het goed is is het resultaat hetzelfde)

[ Voor 33% gewijzigd door BasieP op 16-12-2005 18:42 ]

This message was sent on 100% recyclable electrons.


  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
gooi sowieso 'facturen.datum' even in je 'order by' clause, want zoals je het nu hebt is het geen valid sql.
8)7
(waarom heb je het sowieso toegevoegd, als het goed is is het resultaat hetzelfde)
Maar met having is het wel gelukt

Bedankt _/-\o_

Hier is de uiteindelijke code
SQL:
1
2
3
4
5
6
7
SELECT facturen.id, facturen.datum, facturen.bedrag_voldaan, SUM( factuur_regels.bruto + ( factuur_regels.bruto /100 * factuur_regels.korting ) * factuur_regels.aantal ) AS totaalbedrag
FROM facturen
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
WHERE facturen.klant_id =00001
GROUP BY factuur_regels.factuur_id, facturen.bedrag_voldaan
HAVING facturen.bedrag_voldaan = totaalbedrag
ORDER BY facturen.datum

[ Voor 64% gewijzigd door clooner op 16-12-2005 19:35 ]

Inside The Matrix, they are everyone, and they are no one.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
facturen datum staat nog steeds niet in de group by..
het werkt misschien omdat je mysql gebruikt, maar deze query gaat dus fout als je hem op een goede DB server draait..

This message was sent on 100% recyclable electrons.


  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
BasieP schreef op vrijdag 16 december 2005 @ 19:38:
facturen datum staat nog steeds niet in de group by..
het werkt misschien omdat je mysql gebruikt, maar deze query gaat dus fout als je hem op een goede DB server draait..
Ik moet hem dus in de group by gooien en niet in de order by zoals je eerder omschreef

Kan je trouwens je berekeningen ook afronden?

Inside The Matrix, they are everyone, and they are no one.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
clooner schreef op vrijdag 16 december 2005 @ 19:42:
[...]


Ik moet hem dus in de group by gooien en niet in de order by zoals je eerder omschreef

Kan je trouwens je berekeningen ook afronden?
juist
om Janoz even te quoten
MySQL is gewoon erg lui en daardoor lijkt het of bepaalde dingen zouden kunnen, maar normalitair zou je alle velden die je niet met een agregate function gerbuikt in de group by clausule opnemen. Hierdoor wordt alleen het minimum genomen van de velden die de ander opgevraagde velden gelijk hebben. Door velden in je select op te nemen waarop niet word gegroepeerd is het ongedefinieerd welke je eigenlijk terug krijgt.
en ik weet zo niet of mysql een afrond functie ingebouwd heeft, maar dat kan je vast wel op mysql.com vinden (round() ofzo)

This message was sent on 100% recyclable electrons.


  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
Hierbij nogmaals de uiteindelijke code query.
Zal alleen nog een btw berekening in moeten

SQL:
1
2
3
4
5
6
7
8
SELECT facturen.id, facturen.datum, facturen.bedrag_voldaan, FORMAT( SUM( (
factuur_regels.bruto + ( factuur_regels.bruto /100 * factuur_regels.korting ) ) * factuur_regels.aantal ) , 2
) AS totaalbedrag
FROM facturen
LEFT JOIN factuur_regels ON facturen.id = factuur_regels.factuur_id
WHERE facturen.klant_id =00001
GROUP BY factuur_regels.factuur_id, facturen.bedrag_voldaan, facturen.datum
HAVING facturen.bedrag_voldaan = totaalbedrag

Inside The Matrix, they are everyone, and they are no one.


  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
Uh vaag :? Dit werkt goed zo?

Nou ben ik geen kenner, en gebruik alleen maar Oracle SQL op m'n werk, maar zover ik weet wil Oracle per sé dat alles wat in de select staat ook in de group by staat, anders runt ie niet eens.

Begrijp ik goed uit die post van BasieP dat MySQL niet zo strict is?

  • clooner
  • Registratie: Augustus 2000
  • Laatst online: 18-09-2024
Mike Jarod schreef op vrijdag 16 december 2005 @ 21:07:
Uh vaag :? Dit werkt goed zo?

Nou ben ik geen kenner, en gebruik alleen maar Oracle SQL op m'n werk, maar zover ik weet wil Oracle per sé dat alles wat in de select staat ook in de group by staat, anders runt ie niet eens.

Begrijp ik goed uit die post van BasieP dat MySQL niet zo strict is?
Zover ik het zie werkt dit gewoon goed. Hoe zou het dan correct moeten zijn? Want alles wat in de select staat is toch ook aanwezig in de group by? Of moet ik het totaalbedrag ook meenemen?

[ Voor 6% gewijzigd door clooner op 16-12-2005 21:14 ]

Inside The Matrix, they are everyone, and they are no one.


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
clooner schreef op vrijdag 16 december 2005 @ 21:13:
[...]


Zover ik het zie werkt dit gewoon goed. Hoe zou het dan correct moeten zijn? Want alles wat in de select staat is toch ook aanwezig in de group by? Of moet ik het totaalbedrag ook meenemen?
hij werkt wel, maar dat komt omdat mysql gokt wat er moet staan, je specifieceerd het namelijk niet (zoals het hoord) in de meeste gevallen klopt het idd wat mysql gokt, maar niet altijd.

zodoende is het dus gewoon fout

(verder zijn er hele lijsten met dingen die mysql verkeerd doet, ik zal eens zoeken)
http://openacs.org/philosophy/why-not-mysql.html
[rml][ mysql] zeer veel inserts, wat te doen?![/rml]

vooral dat got topic staat veel in

[ Voor 11% gewijzigd door BasieP op 16-12-2005 21:29 ]

This message was sent on 100% recyclable electrons.


  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
Ja kijk als het werkt dan werkt het toch :) Niets meer aan doen.

Je hebt nu facturen.id in je select welke niet in de group by voorkomt, en factuur_regels.factuur_id in je group by welke niet in de select voorkomt. Ook al zijn die 2 gejoined, Oracle zou dat zover ik weet niet pikken. Ga dit van de week eens uitproberen.

Overigens in je select hoef je niet per se de tabelnaam aan te geven (gewoon id ipv facturen.id) omdat je maar 1 tabel in je from hebt staan. Scheelt weer een beetje tekst Fout. Je hebt meerdere tabellen dankzij die berekening zie ik nu pas.

[ Voor 34% gewijzigd door Mike Jarod op 16-12-2005 21:31 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
Mike Jarod schreef op vrijdag 16 december 2005 @ 21:20:
Overigens in je select hoef je niet per se de tabelnaam aan te geven (gewoon id ipv facturen.id) omdat je maar 1 tabel in je from hebt staan. Scheelt weer een beetje tekst :)
(hij doet een join dus heeft 2 tables)

maar je hebt idd wel een punt, want voor kolommen die maar in 1 van de 2 tabellen voorkomen mag je de tabelnaam weglaten, en ik zou in jouw query niet elke keer de hele query uitschrijven, het zou dus zoiets worden:
SQL:
1
2
3
4
5
6
7
SELECT f.id, f.datum, bedrag_voldaan, FORMAT( SUM((fr.bruto + ( fr.bruto /100 * fr.korting )) * fr.aantal ) , 2
) AS totaalbedrag
FROM facturen f
LEFT JOIN factuur_regels fr ON f.id = fr.factuur_id
WHERE facturen.klant_id = 1
GROUP BY fr.factuur_id, bedrag_voldaan, f.datum
HAVING bedrag_voldaan = totaalbedrag

This message was sent on 100% recyclable electrons.

Pagina: 1