[MySQL] SUM meerdere tabellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb onderstaande SQL queries die perfect doen wat ze moeten doen, voor elke maand het totaal van alle behandelingen/arrangementen in een agenda opvragen en sorteren zodat ik ze nadien eventueel in een grafiek kan gooien. Nu zou ik de treatments.price en arrangements.price willen optellen maar het probleem is dat er per agenda_id meerdere treatments en ook meerdere arrangementen mogelijk zijn en dus krijg ik altijd de verkeerde prijs terug (waarschijnlijk omdat hij 3 behandelingen heeft en dus ook 3x het arrangement telt dat aan die agenda item hangt).

code:
1
2
3
4
5
SELECT `agenda`.*, SUM(treatments.price)
FROM (`agenda`) 
JOIN `agenda_treatments` ON `agenda_treatments`.`agenda_id` = `agenda`.`agenda_id`  
JOIN `treatments` ON `treatments`.`treatment_id` = `agenda_treatments`.`treatment_id`
WHERE `agenda`.`user_id` = '9' AND agenda.date > '2013-01-17' AND agenda.date < '2015-01-17'  GROUP BY year(agenda.date), month(agenda.date)


code:
1
2
3
4
5
SELECT `agenda`.*, SUM(arrangements.price)
FROM (`agenda`) 
JOIN `agenda_arrangements` ON `agenda_arrangements`.`agenda_id` = `agenda`.`agenda_id`  
JOIN `arrangements` ON `arrangements`.`arrangement_id` = `agenda_arrangements`.`arrangement_id`
WHERE `agenda`.`user_id` = '9' AND agenda.date > '2013-01-17' AND agenda.date < '2015-01-17'  GROUP BY year(agenda.date), month(agenda.date)


Onderstaande leek wat mij betreft juist maar werkt dus niet:
code:
1
2
3
4
5
6
7
SELECT `agenda`.*, SUM(treatments.price), SUM(arrangements.price)
FROM (`agenda`) 
JOIN `agenda_treatments` ON `agenda_treatments`.`agenda_id` = `agenda`.`agenda_id` 
JOIN `agenda_arrangements` ON `agenda_arrangements`.`agenda_id` = `agenda`.`agenda_id` 
JOIN `arrangements` ON `arrangements`.`arrangement_id` = `agenda_arrangements`.`arrangement_id`
JOIN `treatments` ON `treatments`.`treatment_id` = `agenda_treatments`.`treatment_id`  
WHERE `agenda`.`user_id` = '9' AND agenda.date > '2013-01-17' GROUP BY year(agenda.date), month(agenda.date)


Iemand enig idee? Ik heb ergens gelezen dat je binnen een SUM ook een select kan doen maar dat blijkt niet te werken... Ik kan wel iets van sql maar dit lijkt voor mij (zelfs na uren zoeken) net iets te hoog gegrepen vrees ik.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zou zeggen: begin eens met Programming FAQ - SQL: Hoe werkt dat GROUP BY nu eigenlijk? Ik denk dat je dan al redelijk snel duidelijk wordt waarom dit gebeurt. :) Sterker nog, als je niet in MySQL zou werken, dan deed je query het waarschijnlijk niet eens. :)

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met andere woorden, wat ik probeerde is niet mogelijk in SQL? Want zelfs als ik zou toepassen wat in die groupby faq staat werkt hij niet ;)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat zeg ik niet. ;) Ik zeg dat je group by verkeerd toepast en als je die FAQ leest weet je waarom het fout gaat. Wat je wil doen is in een subselect geen data selecteren die ervoor zorgt dat je voor elke behandeling een rij terug krijgt, waardoor je gewoon een sum kan doen. Zonder heel erg in detail naar je query gekeken te hebben (geen tijd, sorry) doe je dat meestal door domweg minder te selecteren en/of te splitsen naar twee query's.

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


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
In het laatste geval gebeurt het volgende:
Voor elke agenda worden de treatments opgehaald, en voor elk van die combinaties worden alle arrangements opgehaald, dus als er zowel meerdere treatments als arrangements zijn bij een agenda worden ze beide dubbel geteld.

Je zou de treatmentprijs en de arrangementprijs in een subquery kunnen ophalen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oké, bedankt ;)

[ Voor 28% gewijzigd door Verwijderd op 22-01-2013 21:04 ]

Pagina: 1