Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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总和查询_Mysql_Sql - Fatal编程技术网

使用多个联接时返回错误结果的Mysql总和查询

使用多个联接时返回错误结果的Mysql总和查询,mysql,sql,Mysql,Sql,我的查询返回了来自2个子表的2列不正确的总和,我在google上搜索过,也查看了stackoverflow上的建议,但它们从来没有起作用 si_invoices ----------------------------- id, date 1, 2014-05-07 si_invoice_items ----------------------------- id, invoice_id, date , total 1, 100, 2014-0

我的查询返回了来自2个子表的2列不正确的总和,我在google上搜索过,也查看了stackoverflow上的建议,但它们从来没有起作用

   si_invoices
   -----------------------------
   id, date
   1, 2014-05-07


   si_invoice_items
   -----------------------------
   id, invoice_id, date , total
   1, 100, 2014-05-07, 200
   2, 100, 2014-05-07, 200

   si_payment
   -----------------------------
   id, ac_inv_id, date , payment
   1, 100, 2014-05-07, 100
   2, 100, 2014-05-07, 200

   SELECT  SI.*,SUM(SII.total) as total,SUM(SIP.payment) as payment FROM 
        (SELECT * FROM si_invoices GROUP BY si_invoices.id) AS SI
     LEFT JOIN si_invoice_items SII ON SII.invoice_id = SI.id
     LEFT JOIN si_payment SIP ON SIP.ac_inv_id = SII.invoice_id
   GROUP BY SI.id
对于sql中的字段“total”,它应该返回400 sum,但它返回800,与“payment”相同。你能指出我的问题中的错误吗。请帮忙,谢谢

谢谢 M.S

详细结果:

select a.invoice,ac_inv_id,sum(a.total),sum(b.payment) from
(select 1 as id, 100 as invoice, '2014-05-07' as date, 200 as total union all
select  2, 100, '2014-05-07', 200) as a
left join
(select 1 as id, 100 as ac_inv_id, '2014-05-07' as date, 100 as payment union all
select 2, 100, 2014-05-07, 200) as b
on a.id = b.id
最后查询:

select a.invoice,ac_inv_id,sum(a.total),sum(b.payment) from
(select * from si_invoice_items) as a
left join
(select * from si_payment) as b
on a.id = b.id
结果:

100 100 400 300

直接使用总计,因为您的联接可能会在您想要的组合中创建更多的行

请尝试以下操作:

SELECT id, MAX(Total) as FinalTotal ,MAX(Payment) as FinalPayment
FROM si_invoices a 
    left join 
    (select invoice_id, sum(total) as Total from si_invoice_items group by invoice_id) b 
    on a.id = b.invoice_id
    left join
    (select ac_inv_id, sum(payment) as Payment from si_payment group by ac_inv_id) c 
    on c.ac_inv_id = a.id 
group by id
或者如果id是唯一的:

    SELECT *
FROM si_invoices a 
    left join 
    (select invoice_id, sum(total) as Total from si_invoice_items group by invoice_id) b 
    on a.id = b.invoice_id
    left join
    (select ac_inv_id, sum(payment) as Payment from si_payment group by ac_inv_id) c 
    on c.ac_inv_id = a.id

显示您想要的预期结果。我已经解释了预期结果。请把问题通读一遍。它应该返回400作为总和,但实际上返回的是800.1。由si_invoices从si_invoices组中选择*。id必须给出语法错误。Group By只有一列,您正在尝试获取多个col.SII.invoice_id=SI.id。它应该返回空值。它们各自的表中没有匹配的数据。因此,最终结果必须为空。您是如何获得具有此类语法错误和空数据映射的任何输出(worng/right)的。而不是放置预期的结果值。如果您提到您试图实现的预期输出,这会有所帮助。这是否只是您希望获得的si_发票中所有可用ID的总额和付款的总和。谢谢您的回答,你的第二个问题做得很好。