0

私は請求システムを構築しています。今は、各請求書で合計金額と支払う金額を表示しようとしています。

請求書の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 つの支払いがある場合。支払いは 2 回カウントされます。どうすれば1回だけカウントできますか?

4

1 に答える 1

0

次のように、合計を繰り返し回数で割ることができます。

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

こちらの質問もご覧ください

于 2013-07-25T14:24:32.317 に答える