2016-09-30 5 views
0

Ich möchte Spalte AMOUNT summieren, und das Ergebnis ist füllen Sie die Spalte BALANCE. Wenn die Spalte TYPE DEBIT ist, wird sie summieren. Wenn aber die Spalte TYPE KREDIT ist, wird sie minus. dies ist der Tisch table imageSumme Spalte basierend auf einer anderen Spalte Laravel

die Tabelle zu erstellen, benutzte ich diese Abfrage in Laravel Controller:

$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 ")); 

und ich diesen Code in Ansicht Daten anzuzeigen:

<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> 

ich nicht wissen, wie man den richtigen Code erstellt, um alles zu berechnen. Bitte helfen Sie mir. Vielen Dank im Voraus

Antwort

0

Diese Abfrage

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

meinst du meine obige Abfrage ersetzen? Erhalten Sie diesen Fehler: # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MariaDB-Serverversion entspricht, um die richtige Syntax in der Nähe von 'descript = "Credit" dann statement.amount else 0 end) - (sum (case wenn descript = "Deb' at line 2 – arbong

+0

was ist das? Name des Datenbankfelds, in dem Sie den Wert 'debit'/'credit' gespeichert haben? –

+0

Name des Datenbankfelds, in dem ich den 'Debit'/'Credit' Wert gespeichert habe ist – arbong

0

Die „klassische“ Art und Weise für diese (es ist ein Spezialfall einer laufenden Summe) ist eine korrelierte Abfrage zu verwenden:

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 ; 

oder ein sQL-Variable wie in dieser:

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 ; 

Überprüfen Sie die sqlFiddle für einen Arbeitscode - nicht einschließlich der Kreditgeber beitreten und Ihre anderen wo Kriterien noch.

Verwandte Themen