Можно ли сгруппироватьBy (месяц) и сумму (каждый столбец) в таблице - PullRequest
0 голосов
/ 20 сентября 2018
+---------+--------+---------+---------+
| 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», в других нет «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');;
  });

1 Ответ

0 голосов
/ 20 сентября 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();

Или если вы не хотите указывать имена столбцов в каждом запросе,Вы можете использовать groupBy , 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;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...