首页 文章

是否可以在表格中对groupBy(月份)和sum(每列)进行分组

提问于
浏览
0
+---------+--------+---------+---------+
| 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中获取结果时对groupBy month和sum每个列进行求和(表是动态的,因此没有模型,而且有些表没有列'type_a'其他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');;
  });

1 回答

  • 2

    如果我正确理解您的问题,您可以使用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();
    

    或者,如果您不想在每个查询中指定列名,则可以在集合中使用groupByarray_columnarray_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;
        });
    

相关问题