2017-01-31 6 views
2

Ich habe eine Tabelle, die aus Stunden und den Werten dieser Stunden besteht. Zum Beispiel:Berechnen Sie die Summe der Spalten für das angegebene Zeitintervall

Hour Value1 Value2 
9  100  1 
10  170  4 
11  30  17 
12  144  59 
13  6  1 
. 
. 
. 
23  204  8 

Ich muss Value1 und Value2 für jede Spalte aber für die angegebene Zeitspanne (Intervall) berechnen.

Zum Beispiel:

00-09h Value1 = 100, Value2 = 1 
09-11h Value1 = 300, Value2 = 22 
11-13h Value1 = 180, Value2 = 77 
13h-21h Value1 = ..., Value2 = ... 

All I denken kann, ist Arrays für jedes Intervall zu erzeugen und sie dann mit Schlingenfüllung (überprüfen, ob Wert zu diesem Intervall gehört, dann schieben sie Array).

Aber gibt es einen bequemeren und effizienteren Weg, dies zu tun? Mit Abfrage?

Antwort

2

Mit sum() und whereBetween():

$model = Model::all(); 
$totalValue1=$model->whereBetween('hour',[9,11])->sum('value1'); 
$totalValue2=$model->whereBetween('hour',[9,11])->sum('value2'); 

$totalValue1=$model->whereBetween('hour',[11,13])->sum('value1'); 
$totalValue2=$model->whereBetween('hour',[11,13])->sum('value2'); 

$totalValue1=$model->whereBetween('hour',[13,21])->sum('value1'); 
$totalValue2=$model->whereBetween('hour',[13,21])->sum('value2'); 
+0

Ist 'whereBetween' unterstützte Funktion nur in Laravel 5.4? Weil ich den Fehler bekomme, dass die Funktion nicht existiert. Übrigens. Ich benutze 5.3. Es funktioniert mit whereIn, aber ich muss jede Stunde angeben. Beispiel '$ totalValue1 = $ model-> whereIn ('hour', [11,12,13]) -> sum ('value1');' – harunB10

+0

sollte es auch mit laravel 5.3 sein. Was ist die vollständige Fehlermeldung? –

+1

@ harunB10 können Sie auch 'wobei ('Stunde', Bereich (13,21))' –

2

Sie können eine abgeleitete Tabelle mit den Bereichen on the fly erstellen und verbinden Sie es mit Ihren Tisch:

select s.*, sum(t.Value1) as Value1, sum(t.Value2) as Value2 
from (
    select 0 as start, 9 as end union all 
    select 9 as start, 11 as end union all 
    select 11 as start, 13 as end union all 
    select 13 as start, 21 as end 
) s 
join your_table t on t.Hour between s.start and s.end 
group by s.start, s.end 
Verwandte Themen