2013-07-25 4 views
0

Я строю систему выставления счетов, теперь я пытаюсь получить представление с каждым счетом с общей ценой и суммой, подлежащей оплате.Mysql double join 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` 

поэтому, когда у меня есть 2 счета-фактуры части и 1 платежа для счета-фактуры. платеж засчитывается дважды. как я могу только подсчитать его один раз?

+0

можно разделить сумму на отсчету части счета-фактуры? –

ответ

0

Вы можете разделить сумму на количество повторов, как это:

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

проверить Также из this question

+0

Я не могу видеть, как это будет работать –

+0

Ну ... ваша сумма умножается на количество дополнительных строк, которые поступают из JOIN. Вам просто нужно разделить его на это число, и это будет правильно. Это самый общий способ сделать это (что я могу придумать). – Vatev

+0

Да, но может быть несколько платежей, поэтому это не будет работать. Я думаю, что я должен создать подзапрос, чтобы сделать это (я надеялся, что это не так) –

Смежные вопросы