Mysql 带SUM的左联接未返回正确的值
我有一张有各种成本明细的发票表。 我有一个链接表与杂项成本以及。 关系是一张发票与许多杂项成本的关系 当我执行SUM()时,如果杂项成本表(右)上存在多行,则发票表(左)中的值将乘以找到的行数 DB小提琴: 劳动力、零件、POL和次级分包的原始查询结果不正确:Mysql 带SUM的左联接未返回正确的值,mysql,sql,mariadb-10.1,Mysql,Sql,Mariadb 10.1,我有一张有各种成本明细的发票表。 我有一个链接表与杂项成本以及。 关系是一张发票与许多杂项成本的关系 当我执行SUM()时,如果杂项成本表(右)上存在多行,则发票表(左)中的值将乘以找到的行数 DB小提琴: 劳动力、零件、POL和次级分包的原始查询结果不正确: SELECT SUM(ad.labour_cost) AS LABOUR, SUM(ad.part_cost) AS PARTS, SUM(ad.pol_cost) AS POLS, SUM(ad.sublet_
SELECT SUM(ad.labour_cost) AS LABOUR,
SUM(ad.part_cost) AS PARTS,
SUM(ad.pol_cost) AS POLS,
SUM(ad.sublet_cost) AS SUBLET,
SUM(am.misc_sales_amt) AS MISC
FROM AdvisorSalesData ad
LEFT JOIN AdvisorMiscSalesData am
ON (ad.customer_id=am.customer_id AND ad.invoice_no=am.invoice_no)
WHERE ad.customer_id IN (3)
调整的查询-删除了内部联接,并尝试对misc表进行单个选择,但misc的结果不正确(NULL):
如何调整以在一个查询中获得所有5列的正确结果?加入前聚合:
他是一把小提琴
可以在子查询中重复筛选以获得更好的性能:
SELECT SUM(ad.labour) AS LABOUR,
SUM(ad.parts) AS PARTS,
SUM(ad.pols) AS POLS,
SUM(ad.sublet) AS SUBLET,
SUM(am.misc) AS MISC
FROM (SELECT customer_id, invoice_no,
SUM(ad.labour_cost) AS LABOUR,
SUM(ad.part_cost) AS PARTS,
SUM(ad.pol_cost) AS POLS,
SUM(ad.sublet_cost) as sublet
FROM AdvisorSalesData ad
WHERE ad.customer_id IN (3)
GROUP BY customer_id, invoice_no
) ad LEFT JOIN
(SELECT customer_id, invoice_no,
SUM(am.misc_sales_amt) AS MISC
FROM AdvisorMiscSalesData am
WHERE ad.customer_id IN (3)
GROUP BY customer_id, invoice_no
) am
ON ad.customer_id = am.customer_id AND
ad.invoice_no = am.invoice_no
WHERE ad.customer_id IN (3);
一对多还是多对多?预期的结果是什么?戈登,正确的小提琴:完成后你必须点击更新,否则你只是在复制旧的。干杯。返回正确的结果-谢谢。。。但是,当我把它重新添加到代码中时,执行起来需要269秒。。。。
SELECT SUM(ad.labour) AS LABOUR,
SUM(ad.parts) AS PARTS,
SUM(ad.pols) AS POLS,
SUM(ad.sublet) AS SUBLET,
SUM(am.misc) AS MISC
FROM (SELECT customer_id, invoice_no,
SUM(ad.labour_cost) AS LABOUR,
SUM(ad.part_cost) AS PARTS,
SUM(ad.pol_cost) AS POLS,
SUM(ad.sublet_cost) as sublet
FROM AdvisorSalesData ad
GROUP BY customer_id, invoice_no
) ad LEFT JOIN
(SELECT customer_id, invoice_no,
SUM(am.misc_sales_amt) AS MISC
FROM AdvisorMiscSalesData am
GROUP BY customer_id, invoice_no
) am
ON ad.customer_id = am.customer_id AND
ad.invoice_no = am.invoice_no
WHERE ad.customer_id IN (3);
SELECT SUM(ad.labour) AS LABOUR,
SUM(ad.parts) AS PARTS,
SUM(ad.pols) AS POLS,
SUM(ad.sublet) AS SUBLET,
SUM(am.misc) AS MISC
FROM (SELECT customer_id, invoice_no,
SUM(ad.labour_cost) AS LABOUR,
SUM(ad.part_cost) AS PARTS,
SUM(ad.pol_cost) AS POLS,
SUM(ad.sublet_cost) as sublet
FROM AdvisorSalesData ad
WHERE ad.customer_id IN (3)
GROUP BY customer_id, invoice_no
) ad LEFT JOIN
(SELECT customer_id, invoice_no,
SUM(am.misc_sales_amt) AS MISC
FROM AdvisorMiscSalesData am
WHERE ad.customer_id IN (3)
GROUP BY customer_id, invoice_no
) am
ON ad.customer_id = am.customer_id AND
ad.invoice_no = am.invoice_no
WHERE ad.customer_id IN (3);