2016-09-30 6 views
0

Я хочу суммировать столбец AMOUNT, и результат заполнит столбец BALANCE. если столбец TYPE DEBIT, то он будет суммировать .., но если столбец TYPE - KREDIT, тогда он будет минус. это таблица table imageСумма столбца на основе другого столбца laravel

создать эту таблицу, я использовал этот запрос в контроллер Laravel:

$get_result  = DB::select(DB::raw("SELECT statement.created_at, statement.descript, statement.amount, statement.sign, statement.reference 
                FROM statement,lender 
                WHERE statement.created_at BETWEEN DATE_ADD(' $date_from ',INTERVAL 1 DAY) 
                AND '$date_to' 
                AND statement.lender_id = lender.id 
                AND lender.user_id= $userId ")); 

и я использовал этот код в целях отображения данных:

<thead> 
           <tr class="txtcenter"> 
            <th class="all">Date </th> 
            <th class="all">Description </th> 
            <th class="all">Amount</th> 
            <th class="all">Type</th> 
            <th class="all">Reference</th> 
            <th class="all">Balance</th> 
           </tr> 
          </thead> 
          <tbody>@foreach($get_result as $statement) 
            <tr class="accordion"> 
             <td>{{SUBSTR($statement->created_at,0,10) }}</div> 
             <td>{{$statement->descript}} </div> 
             <td>IDR {{number_format($statement->amount, 0, '.', ',')}} </div> 
             <td>{{ $statement->sign }} </div> 
             <td>{{ $statement->reference }} </div> 
             <td> </div> 
            </tr>@endforeach 
          </tbody> 

Я не знаете, как сделать правильный код, чтобы рассчитать все это. Пожалуйста, помогите мне. Заранее спасибо

ответ

0

Попробуйте этот запрос

SELECT statement.created_at, statement.descript, statement.amount, statement.sign, statement.reference, (sum(case when statement.descript = 'Credit' then statement.amount else 0 end) - sum(case when statement.descript = 'Debit' then statement.amount else 0 end)) balance FROM statement,lender WHERE statement.created_at BETWEEN DATE_ADD(' $date_from ',INTERVAL 1 DAY) AND '$date_to' AND statement.lender_id = lender.id AND lender.user_id= $userId

+0

Вы имели в виду замену моего запроса выше? получите эту ошибку: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с «descript =« Credit »then statement.amount else 0 end) - (сумма, когда descript =« Deb »в строке 2 – arbong

+0

что такое имя поля базы данных, в котором вы сохранили значение «дебет»/«кредит»? –

+0

имя поля базы данных, где я записал значение «Дебет»/«Кредит», является дескриптором – arbong

0

«Классический» способом для этого (это частный случай текущей суммы) является использование коррелированного запроса:

SELECT statement.created_at, statement.descript, statement.amount, statement.REFERENCE, 
    (SELECT 
     SUM(CASE WHEN t2.descript = 'Debit' THEN t2.amount 
       WHEN t2.descript = 'Credit' THEN -t2.amount ELSE 0 END) 
     FROM statement t2 
     WHERE t2.created_at <= statement.created_at 
    ) AS Balance 
FROM statement 
ORDER BY statement.created_at ; 

или использовать SQL переменную, как в этом:

SET @csum := 0; 
SELECT statement.created_at, statement.descript, statement.amount, 
     statement.REFERENCE, 
    (CASE WHEN statement.descript = 'Debit' THEN 
      (@csum := @csum + statement.amount) 
      WHEN statement.descript = 'Credit' THEN 
      (@csum := @csum - statement.amount) 
     ELSE 0 
    END) as Balance 
FROM statement 
ORDER BY statement.created_at ; 

Проверьте рабочий код sqlFiddle - не включая соединение кредитора, а другое, где еще нет критериев.