我正在嘗試進行報告。它應該給我一個特定客戶的機器清單以及放入該機器的小時數和材料總和。具有多個左連接的錯誤值(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