我正在尝试进行报告。它应该给我一个特定客户的机器清单以及放入该机器的小时数和材料总和。具有多个左连接的错误值(MySQL)
在下面的例子中,我选择不同领域的材料和小时数的总和,以使问题更清楚。但我真的想把这些材料总结一小时,然后在机器领域分组。
我可以查询机器列表和小时数没有问题的成本。
SELECT CONCAT(`customer`.`PREFIX`, `wo`.`machine_id`) AS `machine`,
ROUND(COALESCE(SUM(`wohours`.`length` * `wohours`.`price`), 0), 2) AS `hours`
FROM `wo`
JOIN `customer` ON `customer`.`id`=`wo`.`customer_id`
LEFT JOIN `wohours` ON `wohours`.`wo_id`=`wo`.`id` AND `wohours`.`wo_customer_id`=`wo`.`customer_id`
AND `wohours`.`wo_machine_id`=`wo`.`machine_id` AND `wohours`.`date`>=(CURDATE() - INTERVAL DAY(CURDATE() - INTERVAL 1 DAY) DAY) - INTERVAL 11 MONTH
WHERE `wo`.`customer_id`=1
GROUP BY `wo`.`machine_id`;
这给了我几个小时的正确值。但是当我添加这样的材料时:
SELECT CONCAT(`customer`.`PREFIX`, `wo`.`machine_id`) AS `machine`,
ROUND(COALESCE(SUM(`wohours`.`length` * `wohours`.`price`), 0), 2) AS `hours`,
ROUND(COALESCE(SUM(`womaterial`.`multiplier` * `womaterial`.`price`), 0), 2) AS `material`
FROM `wo`
JOIN `customer` ON `customer`.`id`=`wo`.`customer_id`
LEFT JOIN `wohours` ON `wohours`.`wo_id`=`wo`.`id` AND `wohours`.`wo_customer_id`=`wo`.`customer_id`
AND `wohours`.`wo_machine_id`=`wo`.`machine_id` AND `wohours`.`date`>=(CURDATE() - INTERVAL DAY(CURDATE() - INTERVAL 1 DAY) DAY) - INTERVAL 11 MONTH
LEFT JOIN `womaterial` ON `womaterial`.`wo_id`=`wo`.`id` AND `womaterial`.`wo_customer_id`=`wo`.`customer_id`
AND `womaterial`.`wo_machine_id`=`wo`.`machine_id` AND `wohours`.`date`>=(CURDATE() - INTERVAL DAY(CURDATE() - INTERVAL 1 DAY) DAY) - INTERVAL 11 MONTH
WHERE `wo`.`customer_id`=1
GROUP BY `wo`.`machine_id`;
然后小时和材料值都不正确。
我读过其他线程,其中有相似问题的人可以通过将其拆分为多个查询或子查询来解决此问题。但我认为在这种情况下这是不可能的。
任何帮助表示赞赏。
//约翰
这是真棒单行。奇迹般有效。 – John 2013-02-28 19:38:09
我不知道你可以加入子查询。有很多东西需要学习。无论如何...再次感谢。 – John 2013-02-28 19:39:20
你如何构建这样的查询?你只是从上到下写下它们,还是你有一个方法呢? – John 2013-02-28 19:45:11