2017-01-31 5 views
2

У меня есть таблица, которая состоит из часов и значений тех часов. Например:Рассчитать сумму столбцов за определенный интервал времени

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

Мне нужно рассчитать Value1 и Value2 для каждого столбца, но за указанный период времени (интервал).

Например:

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

Все, что я могу думать о том, чтобы создать массивы для каждого интервала, а затем заполнить их с петлей (проверьте, если значение принадлежит к этому интервалу, а затем вставьте его в массив).

Но есть ли более удобный и эффективный способ сделать это? С запросом?

ответ

2

Использование sum() и 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

ли 'whereBetween' функция поддерживается только в Laravel 5,4? Потому что я получаю ошибку, что функция не существует. Btw. Я использую 5.3. Он работает с 'whereIn', но мне нужно указывать каждый час. Пример '$ totalValue1 = $ model-> гдеIn ('hour', [11,12,13]) -> sum ('value1');' – harunB10

+0

тоже должно быть хорошо с laravel 5.3. Каково полное сообщение об ошибке? –

+1

@ harunB10 Вы также можете использовать 'whereIn ('hour', range (13,21))' –

2

Вы можете создать производную таблицу с диапазонами на лету и объединить его с таблицей:

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