Toon posts:

[MySQL] SUM() één keer per groep rows toepassen

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

Verwijderd

Topicstarter
Ben bezig met het aanpassen van osCommerce, na het toevoegen van een order status 'Geannuleerd' kwam ik op het probleem dat wanneer je naar het overzicht gaat van orders totaal statistieken, dat ie daarbij ook de bedragen van de geannuleerde orders optelt.

Wat ik dus wil doen is checken per order of ie geen orders_status_id van '4' heeft. Heeft ie dat niet dan mag het totale bedrag van de order opgeteld worden bij het totaal van de klant.

Ik heb de volgende query:
SQL:
1
2
3
4
5
6
7
select c.customers_firstname, c.customers_lastname, sum(op.products_quantity * op.final_price) as ordersum 
from 
  customers c, orders_products op, orders o, orders_status_history osh 
where 
  c.customers_id = o.customers_id and o.orders_id = op.orders_id and osh.orders_id = o.orders_id and osh.orders_status_id != '4' 
group by 
  c.customers_firstname, c.customers_lastname order by ordersum DESC

Sinds er nog drie andere order status mogelijkheden zijn naast 'Geannuleerd' (1 => 'Besteld', 2 => 'Wordt verwerkt', 3 => 'Afgeleverd') krijg MySQL meerdere rows per order, en telt de order som telkens op.
Op deze manier krijg ik dus per order een bedrag dat 3x groter is dan ie werkelijk is.

Hoe kan ik zorgen dat ie checkt dat de order geen orders_status_id van '4' heeft, en daarnaast per order eenmaal het ordertotaal berekent?

Alvast bedankt!

edit:
SQL query minder layoutvern**kend gemaakt

[ Voor 8% gewijzigd door Verwijderd op 16-09-2004 12:33 ]


Verwijderd

Waarom komt een order meerdere keren in de tabel voor dan. Kun je niet gewoon de status aanpassen, ipv de order dubliceren met een andere orderstatus?

Verwijderd

Topicstarter
De order history wordt bijgehouden zodat er een overzicht blijft van hoe de status is veranderd met evt. opmerkingen erbij.

Verwijderd

Is dus in principe het meest praktisch in een andere tabel met orderId, orderStatus en een timestamp ofzo.

Maar ok, waarom pak je niet alleen de entries met status = 'Besteld', ik neem aan dat alles een keer besteld wordt.

Verwijderd

Topicstarter
Bedankt voor die opmerking, ik had over het hoofd gezien dat de tabel orders ook een kolom orders_status had met de status waarin de order zit momenteel bevindt.

Door daarin te checken of ie niet '4' is krijg ik wel het goede resultaat:
SQL:
1
2
3
4
5
6
7
8
9
select c.customers_firstname, c.customers_lastname, sum(op.products_quantity * op.final_price) as ordersum 
from 
  customers c, orders_products op, orders o 
where 
  c.customers_id = o.customers_id and o.orders_id = op.orders_id and o.orders_status != '4' 
group by 
  c.customers_firstname, c.customers_lastname 
order by 
  ordersum DESC