1) Ik heb een kaarten bestelsysteem waarin ik graag ALLE kaarten bij elkaar opgeteld wil zien (Klant 1 heeft 3 kaarten, klant 2 heeft 5 kaarten). Alle kaarten kosten 9,50 per stuk.
2) Aan de kaarten hangt ook een prijs. Het totaalbedrag per klant is hierbij makkelijk te berekenen (2 kaarten x 9.50), maar hoe doe ik dat nu met het TOTAAL aantal kaarten in de gehele database en de bedragen hierbij?
Aangenomen dat de tabel bestellingen heet, met kolommen klant_id, klant_naam en klant_besteld.
Met deze regel krijg je het aantal bestelde kaarten met totaalprijs per klant :
SELECT klant_naam AS klant , "9,50" AS prijs, SUM(klant_besteld) AS aantal, SUM(klant_besteld) * 9.50 AS totaal FROM bestellingen WHERE klant_id <= 5 GROUP BY klant_id;
Met deze regel krijg je het totaal bestelde kaarten met totaalprijs :
SELECT "9,50" AS prijs, SUM(klant_besteld) AS aantal, SUM(klant_besteld) * 9.50 AS totaal FROM bestellingen WHERE klant_id <= 5;
De WHERE moet je naar eigen inzicht gebruiken.
Bovenstaand kan je vinden in de MySQL handleiding.
Met PHP kan je de velden invullen m.b.v. variabelen.
PS de queries had ik al voorbereid, ze komen dus niet overeen met de latere posts.
Ik sluit me aan bij wat Ariën zegt over fetch en gebruik van verouderde functies.
Voor weergave met 2 decimalen, kun je doen:
ROUND(SUM(Kaarten * Aangepaste_prijs), 2)
[size=xsmall]Toevoeging op 26/05/2016 22:02:50:[/size]
@Adoptive, het is een goede gewoonte en aanrader om bij GROUP BY alle velden te noemen die niet als SUM ,MAX, MIN, of dergelijke worden gebruikt.
Dus ik zou dit doen:
SELECT klant_naam AS klant , "9,50" AS prijs, SUM(klant_besteld) AS aantal, SUM(klant_besteld) * 9.50 AS totaal
FROM bestellingen
WHERE klant_id <= 5
GROUP BY klant_naam, prijs;
@Jan: het is niet alleen een goede gewoonte om alle non-aggregrates in je GROUP BY te zetten, het is een vereiste, anders krijg je zinloze resultaten. Maar dat wist je natuurlijk al.
@Adoptive: leuk dat je een voorbeeld online zet, maar zet je SQL mode eens op strict, dan zie je dat je queries niet kloppen.