【问题标题】:Mysql double join SUM invoice total and paymentsMysql双重加入SUM发票总额和付款
【发布时间】:2013-07-25 11:10:58
【问题描述】:

我建立了一个发票系统,现在我尝试查看每张发票的总价和要支付的金额。

我离开加入了发票上的 invoice_part 表并进行了总结,现在我也想加入付款表,但是当我总结时,有时会多次付款。有没有一种方法可以让我完成加入只收一次付款?

$stmt->from(array('x'=>'invoice'),array('x.id as id','x.ref_id as ref_id','x.start_date as start_date','x.regard as regard','x.project_code as project_code'));
$stmt->joinLeft(array('ip'=>'invoice_part'),'x.id=ip.invoice_id','SUM(ip.price*ip.amount*(100-ip.discount)/100) as price_ex');
$stmt->joinLeft(array('p'=>'payment'),'x.id=p.invoice_id','SUM(ip.price*ip.amount*(100-ip.discount)*(100+tax)/10000)-IFNULL(SUM(p.amount),0) as price_open');
//joins the payment multiple times if there are multiple invoice parts, payment should only be joined once
//note: there can be multiple payments for one invoice
$stmt->group('x.id');

结果查询:

SELECT  `x`.`id` ,  `x`.`ref_id` ,  `x`.`start_date` ,  `x`.`regard` ,  `x`.`project_code` ,  `o`.`name` AS  `contact` ,  `d`.`name` AS  `department` ,  `c`.`name` AS  `company` ,  `is`.`name` AS  `status` , SUM( ip.price * ip.amount * ( 100 - ip.discount ) /100 ) AS  `price_ex` , SUM( ip.price * ip.amount * ( 100 - ip.discount ) * ( 100 + tax ) /10000 ) - IFNULL( SUM( p.amount ) , 0 ) AS  `price_open` 
FROM  `invoice` AS  `x` 

LEFT JOIN  `invoice_part` AS  `ip` ON x.id = ip.invoice_id
LEFT JOIN  `payment` AS  `p` ON x.id = p.invoice_id
GROUP BY  `x`.`id` 

所以当我有 2 个发票部分和 1 个发票付款时。付款被计算两次。怎么只能算一次呢?

【问题讨论】:

  • 你能把总和除以发票部分的数量吗?

标签: mysql sql zend-framework


【解决方案1】:

您可以将总和除以重复次数,如下所示:

SUM(tbl.field_to_sum) / COUNT(tbl.primary_key) * COUNT(DISTINCT tbl.primary_key)

还可以查看this question

【讨论】:

  • 嗯...您的总和乘以来自 JOIN 的附加行数。您只需将其除以该数字即可。这是最通用的方法(我能想到的)。
  • 是的,但是可以有多次付款,所以这将不起作用。我想我必须创建一个子查询来做到这一点(我希望不要这样做)
  • 它也应该适用于多次付款。毕竟这就是 SUM 的意义所在。
猜你喜欢
  • 2015-10-09
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多