2013-07-25 2 views
0

인보이스 발행 시스템을 구축 했으므로 각 인보이스로 총 금액과 지불 할 금액을 확인하려고합니다.Mysql 이중 합계 SUM 송장 총계 및 지급

인보이스에 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` 

그래서 난이 개 송장 부품 및 송장 1 개 지불이있을 때. 지불액은 두 번 계산됩니다. 어떻게 한 번 계산할 수 있습니까?

+0

당신이 송장 부품의 수에 의해 합계를 나눌 수있는 체크 아웃? –

답변

0

이 같은 반복의 숫자로 합계를 나눌 수 있습니다 :

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

는 또한 this question

+0

이것이 어떻게 작동하는지 알 수 없습니다. –

+0

음 ... 합계에 JOIN에서 오는 추가 행의 수를 곱합니다. 그 번호로 나누면됩니다. 이것이 가장 일반적인 방법입니다 (내가 생각해 낼 수 있습니다). – Vatev

+0

네, 그렇지만 복수 지불이있을 수 있습니다. 나는 이것을 수행하기 위해 하위 쿼리를 만들어야한다고 생각한다. (나는하지 말 것을 희망했다.) –