create table invoice (
objectid int unsigned NOT NULL,
clientlink int unsigned NOT NULL,
status enum('unpaid','paid') default 'unpaid',
checkccno int unsigned default NULL,
balance decimal(6,2) default 0,
creationdate datetime default "0000-00-00 00:00:00",
duedate datetime default "0000-00-00 00:00:00",
d_sent0 datetime default "0000-00-00 00:00:00",
d_sent1 datetime default "0000-00-00 00:00:00",
d_sent2 datetime default "0000-00-00 00:00:00",
d_paid datetime default "0000-00-00 00:00:00"
/* shortnote varchar(255) */
) Engine=InnoDB;
create table invoice_items (
invoicelink int unsigned NOT NULL,
custpackagelink int unsigned NOT NULL,
/* state enum('unpaid','paid') default 'unpaid', */
amount decimal(6,2) default 0,
danamount decimal(6,2) default 0,
creationdate datetime default '0000-00-00 00:00:00'
) Engine=InnoDB;
create table tutos_packages (
/* There is no objectid needed, as tutos has its own number generator */
tutoslink int NOT NULL primary key,
productlink int NOT NULL,
invoicelink int unsigned NOT NULL,
performed datetime default "0000-00-00 00:00:00",
bugid varchar(30),
worker char(3),
workerid int NOT NULL,
description varchar(120) NOT NULL,
costperunit decimal(10,3) default 0,
units decimal(5,3) default 0
) Engine=InnoDB;
SELECT invoice.objectid,duedate,IFNULL(sum(amount),0),IFNULL(sum(costperunit*units),0),balance FROM invoice LEFT JOIN invoice_items ON invoice_items.invoicelink=invoice.objectid LEFT JOIN tutos_packages ON tutos_packages.invoicelink=invoice.objectid WHERE clientlink = 130 GROUP BY objectid ORDER BY status DESC,duedate DESC;
If we assume there is 1 row that matches on invoice_items and 20 rows that match on tutos_packages, the sum gets messed up because the sum(amount) gets added 20 times instead of once. How do I fix this query so it only counts sum(amount) and sum(costperunit*units) properly?
Example output:
+----------+---------------------+-------------+---------+
| objectid | duedate | Total | balance |
+----------+---------------------+-------------+---------+
| 133 | 2006-10-28 00:00:00 | 85.000000 | 85.00 |
| 135 | 2006-10-28 00:00:00 | 1082.500000 | 892.50 |
+----------+---------------------+-------------+---------+
2 rows in set (0.00 sec)
From this sample, Total *should* == balance but it does not where objectid=135. 133 is accurate because it only has rows on invoice_items.