+---------+--------+---------+---------+
| date | type_a | type_b | type_zzz|
+---------+--------+---------+---------+
|01-01-18 | 12 | 10 | 1 |
|02-01-18 | 2 | 5 | 1 |
|03-01-18 | 7 | 2 | 2 |
|01-02-18 | 13 | 6 | 55 |
|02-02-18 | 22 | 33 | 5 |
+---------+--------+---------+---------+
Привет,
В приведенном выше примере я хотел бы знать, можно ли сгруппировать по месяцам и суммировать каждый столбец при получении результатов в Laravel (таблицы являются динамическими, поэтому для них нет моделей, а также в некоторых таблицах нет столбца 'type_a' other don ' нет 'type_zzz' и т. д ...).
Я хочу получить из приведенной выше таблицы примерно следующее:
"01" =>
'type_a' : '21',
'type_b' : '17',
'type_zzz': '4'
"02" =>
'type_a' : '35',
'type_b' : '39',
'type_zzz': '60'
Я использую следующий код, чтобы сгруппировать его по месяцам, но я не могу найти решение для возврата суммы по каждому столбцу:
DB::table($id)->get()->groupBy(function($date) {
return Carbon::parse($date->repdate)->format('m');;
});
Даты указаны в правильном формате ISO Y-m-d, а значения относятся к разным годам. Я использую mysql. Спасибо!
что ты так далеко продвинулся?
@moravac, поэтому, если значения относятся к разным годам, а вы группируете по месяцам, данные за сентябрь 2017 года и сентябрь 2018 года должны быть объединены в соответствии с вашим описанием?






Если я правильно понимаю ваш вопрос, вы можете сгруппировать и суммировать значения с помощью SQL-запроса:
$grouped = DB::table('table_name')
->selectRaw('
SUM(type_a) AS type_a,
SUM(type_b) AS type_b,
SUM(type_z) AS type_z
')
->groupByRaw('MONTH(date)')
->get();
Или, если вы не хотите указывать имена столбцов в каждом запросе, вы можете использовать группа по, array_column и array_sum в своей коллекции:
$grouped = DB::table('table_name')
->get()
->groupBy(function ($item) {
return Carbon::parse($item->date)->format('m');
})
->map(function ($group) {
$group = $group->toArray();
$summed = [];
$columns = array_keys($group[0]);
array_shift($columns);
foreach ($columns as $column) {
$summed[$column] = array_sum(array_column($group, $column));
}
return $summed;
});
Я пробую второе решение, но получаю следующую ошибку: array_keys() expects parameter 1 to be array, object given
@moravac - Я отредактировал свой ответ. К сожалению, у меня нигде не установлен Laravel, чтобы можно было это проверить, поэтому я писал его по памяти.
Не повезло, Call to undefined method stdClass::keys()
Хорошо, вернемся к array_keys() и просто приведем group к массиву.
Подхожу ближе, теперь проблема с array_column: array_column() expects parameter 1 to be array, object given
Ржу не могу. Хорошо, обновил снова, чтобы преобразовать group в массив.
Сейчас я получаю результаты, но они сгруппированы по дням и сумма равна 0: Collection {#236 ▼ #items: array:4 [▼ "2018/06" => array:25 [▼ 0 => 0 1 => 0 2 => 0 3 => 0 4 => 0 5 => 0 6 => 0 7 => 0
Можете ли вы dd($group, $group->first()); внутри первой функции map?
Пожалуйста, найдите ss здесь: drive.google.com/file/d/1_QYI2jlBrFaw5_Wj3-T2hBdFR6XLT9qa/…
Спасибо за это. Хорошо, последнее изменение намного более подробное, но я заметил, что необходимо удалить поле даты из массива. Надеюсь, на этот раз это сработает. Если нет, я думаю, вам придется отлаживать себя или ждать, пока кто-то, у кого установлен Laravel, поможет.
Спасибо чувак! Небольшое изменение: вместо: $summed[$column] = array_column($group, $column); должно быть: $summed[$column] = array_sum(array_column($group, $column)); Еще раз большое вам спасибо!
Действительно ли дата в вашей базе данных находится в формате
d-m-yили действительно в правильном формате ISOY-m-d? Все ли значения из одного года (2018) или сгруппированы месяцы из разных лет, что вы хотите? А какую СУБД вы используете?