Почему функция Sum () в (My) SQL возвращает двойное значение, которое я ожидаю?

0

Мне нужна сумма двух разных столбцов из двух разных таблиц: tbl_bill и tbl_receipt.

tbl_receipt

 id receipt_no  member_id   receipt_amount
 1  21001         21        20500
 2  21002         21        200

tbl_member

  id    name
  21    priya

tbl_invoice

 id bill_no  order_id   member_id     bill_value
 1  30001       30          21          20928
 2  0002501     25          21          12030

Я хочу ответить таким образом

member_id  member_name  receipt_sum  bill_sum   
21         priya        20700         32958

Я попытался сделать левое соединение, но он удваивает значение суммы. Может кто-нибудь мне помочь?

$adapter = $this->tableGateway->getAdapter();
       $orderTable = new TableGateway('tbl_receipt', $adapter);
       $sqlSelect = $orderTable->getSql()->select();
       $sqlSelect->columns(array('id'=>'id','bill_amount'=>'bill_total','sum_receipt_amount'=>new \Zend\Db\Sql\Expression('SUM(tbl_receipt.receipt_amount)'))); 
       $sqlSelect->join('tbl_member','tbl_member.id = tbl_receipt.member_id', array('member_id'=>'id','member_name'=>'name'),'LEFT');
     //  $sqlSelect->join('tbl_receipt','tbl_receipt.member_id = tbl_bill.member_id', array('receipt_id'=>new \Zend\Db\Sql\Expression('(tbl_receipt.receipt_amount)')),'LEFT');


       $sqlSelect->group('tbl_member.id');
       $resultSet = $orderTable->selectWith($sqlSelect);
        //echo"<pre>";

   // print_r($resultSet); die;
  return $resultSet;
  • 0
    Пожалуйста, предоставьте ваш существующий запрос для ясности.
  • 1
    «Я пытался сделать левое соединение, но это удваивает значение суммы». - где это находится? Может быть, вы где-то допустили ошибку, а мы этого не знаем; "вы делаете.
Показать ещё 5 комментариев
Теги:
zend-framework2

1 ответ

2
Лучший ответ

В SQL Вы должны оставить join для результата для суммы

select m.id, m.name,t1.sum_amount, t2.sum_total
from tbl_member m  
left join (
  select member_id, sum(receipt_amount) sum_amount 
  from tbl_receipt
  group by member_id
) t1 on t1.member_id = m.member_id 
left  join (
  select member_id, sum(total) sum_total
  from tbl_invoice
  group by member_id
) t2  on t2.t1.member_id = m.member_id 
  • 0
    Суть в том, что вы используете подзапрос, а не просто как левое соединение.
  • 0
    Я использую два левых соединения для агрегированного результата .. поэтому избегайте дублирования, связанного с соединением с неагрегированной строкой ..
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню