Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带SUM的左联接未返回正确的值_Mysql_Sql_Mariadb 10.1 - Fatal编程技术网

Mysql 带SUM的左联接未返回正确的值

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_

我有一张有各种成本明细的发票表。 我有一个链接表与杂项成本以及。 关系是一张发票与许多杂项成本的关系

当我执行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_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);