[mySQL] SELECT totalen uit verschillende tabellen

Pagina: 1
Acties:

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Er zijn twee tabellen in een MySQL-database

ORDERS
OrderIDKlantIDAdmKosten
1110
215


ORDERREGELS
OrderIDArtikelIDPrijs
1125
1250
2125
2250


Nu wil ik met één select uit de database het totaal van AdmKosten en het totaal van Prijs hebben voor de klant met KlantID = 1, dus de totalen van beide orders.

Ik heb het als volgt geprobeerd:
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT
     SUM(O.AdmKosten) AS AdmTot, 
     SUM(R.Prijs) AS AdmTot
FROM
     orders O 
LEFT JOIN 
     orderregels R ON (O.OrderID = R.OrderID)
WHERE
     O.KlantID = 1
GROUP BY
     O.KlantID


Resultaat is dan het volgende:

AdmTotPrijsTot
30150


PrijsTot is netjes een optelling van de prijzen. Deze waarde klopt. AdmTot klopt echter niet, dit is ook logisch want door de join komt hij de AdmKosten in elke regel tegen.

Is er een manier om beide totalen correct te krijgen binnen een enkele select?

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

NMe

Quia Ego Sic Dico.

Volgens mij kan dit alleen als je versie 4.1 of hoger hebt, aangezien je dan een subquery nodig gaat hebben, voor zover ik kan zien althans.

'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.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Misschien kan ie zoiets?:
code:
1
2
3
4
select sum(sum(r.prijs)+o.admkosten)
from orders o
...
group by o.orderid

Who is John Galt?


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
justmental schreef op woensdag 19 januari 2005 @ 14:40:
Misschien kan ie zoiets?:
code:
1
2
3
4
select sum(sum(r.prijs)+o.admkosten)
from orders o
...
group by o.orderid
die sum(sum(r.prijs)+o.admkosten) is volgens mij niet wat ie wil, maar wil ie gewoon apart de totalen van de admKosten en prijzen hebben.

Volgens mij gaat dit inderdaad niet zonder subquery (of temp table) werken.

Waarom heb je trouwens de prijs in de orderregels staan? Staat die niet al in een andere tabel (die via het ArtikelID is terug te vinden)

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
marty schreef op woensdag 19 januari 2005 @ 15:24:
[...]
Waarom heb je trouwens de prijs in de orderregels staan? Staat die niet al in een andere tabel (die via het ArtikelID is terug te vinden)
Voor de historie. Als er prijswijzigingen zijn mag dat niet in orders doorwerken die in het verleden liggen.

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
nog even nagedacht en ... echt mooi is het niet, maar volgens mij zou dit nog wel eens kunnen werken

[...] 8)7 werkt niet

[ Voor 54% gewijzigd door marty op 19-01-2005 15:50 ]


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Heeft er nog iemand een idee?

Verwijderd

Volgens mij kan het inderdaad niet in 1 SELECT Query aangezien je SUM niet DISTINCT kan optellen.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Misschien dat dit werkt:

code:
1
2
3
4
5
6
SELECT SUM(o.admkosten)/(COUNT(r.prijs)/COUNT(o.admkosten)) AS AdmTot,
SUM(r.prijs) As PrijsTot
FROM orders o
LEFT JOIN orderregels r ON (o.orderid=r.orderid)
WHERE o.klantid=1
GROUP BY o.klantid


Potentieel probleem: prijs=0 of admkosten=0, dit zou leiden tot divide by zero.
Overigens heb ik geen mysql, dus ik heb dit niet kunnen testen.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als je mysql 4.0 of hoger gebruikt kun je wellicht beter een union gebruiken:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(
 SELECT
     SUM(O.AdmKosten) AS AdmTot
 FROM
    orders O 
 WHERE
      klantid = 1
)
UNION 
(
 SELECT
     SUM(R.Prijs) AS AdmTot
 FROM
     orders O 
 LEFT JOIN 
     orderregels R ON (O.OrderID = R.OrderID)
 WHERE
     O.KlantID = 1
 GROUP BY
      O.KlantID
)


(haakjes zijn niet verplicht, wellicht zelfs fout, dit is ongetest)

[ Voor 9% gewijzigd door ACM op 20-01-2005 12:03 ]


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
bigbeng schreef op donderdag 20 januari 2005 @ 11:55:
Misschien dat dit werkt:

code:
1
2
3
4
5
6
SELECT SUM(o.admkosten)/(COUNT(r.prijs)/COUNT(o.admkosten)) AS AdmTot,
SUM(r.prijs) As PrijsTot
FROM orders o
LEFT JOIN orderregels r ON (o.orderid=r.orderid)
WHERE o.klantid=1
GROUP BY o.klantid


Potentieel probleem: prijs=0 of admkosten=0, dit zou leiden tot divide by zero.
Overigens heb ik geen mysql, dus ik heb dit niet kunnen testen.
Dit gaat niet werken. Beide COUNTs zullen het totaal van het aantal rows zijn (voor groepering) (4 in dit geval) en dus deel je uiteindelijk gewoon door 1

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
ACM schreef op donderdag 20 januari 2005 @ 12:02:
Als je mysql 4.0 of hoger gebruikt kun je wellicht beter een union gebruiken:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(
 SELECT
     SUM(O.AdmKosten) AS AdmTot
 FROM
    orders O 
 WHERE
      klantid = 1
)
UNION 
(
 SELECT
     SUM(R.Prijs) AS AdmTot
 FROM
     orders O 
 LEFT JOIN 
     orderregels R ON (O.OrderID = R.OrderID)
 WHERE
     O.KlantID = 1
 GROUP BY
      O.KlantID
)


(haakjes zijn niet verplicht, wellicht zelfs fout, dit is ongetest)
Resultaat is twee rijen. In real life select ik nog meer velden mee dus dat is geen optie.

  • ArcticTiger
  • Registratie: Oktober 2003
  • Nu online
maar waarom perse in 1 select?
misschien een achterlijke vraag?

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
ArcticTiger schreef op donderdag 20 januari 2005 @ 17:21:
maar waarom perse in 1 select?
misschien een achterlijke vraag?
Omdat er meerdere rijen worden geselect. Het gaat om facturen waarin totaaltellingen worden opgenomen.

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

In Access werkt dit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT A.klantid,  (totkosten+totprijs) AS admtot
FROM (
  SELECT klantid, SUM(admkosten) AS totkosten
  FROM Orders AS O
  GROUP BY klantid ) AS A
, (
  SELECT klantid, SUM(prijs) AS totprijs
  FROM Orders AS O
  LEFT JOIN Orderregels AS R ON (R.orderid = O.orderid)
  GROUP BY klantid ) AS B
WHERE A.klantid=B.klantid
;

[ Voor 6% gewijzigd door NetForce1 op 20-01-2005 19:05 . Reden: hij pakt nu alle klanten ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"

Pagina: 1