Laravel 是否可以在表中按(月)分组和求和(每列)

Laravel 是否可以在表中按(月)分组和求和(每列),laravel,eloquent,Laravel,Eloquent,嗨 在上面的示例中,我想知道在Laravel中获得结果时是否可以按月分组并对每个列求和(表是动态的,因此没有模型,而且有些表没有列“type_a”或“type_zzz”等) 我希望从上表中得到如下信息: +---------+--------+---------+---------+ | date | type_a | type_b | type_zzz| +---------+--------+---------+---------+ |01-01-18 | 12 | 10

在上面的示例中,我想知道在Laravel中获得结果时是否可以按月分组并对每个列求和(表是动态的,因此没有模型,而且有些表没有列“type_a”或“type_zzz”等)

我希望从上表中得到如下信息:

+---------+--------+---------+---------+
| 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 |
+---------+--------+---------+---------+
我使用以下代码按月对其进行分组,但我无法找到按每列返回总和的解决方案:

"01" =>
    'type_a' : '21',
    'type_b' : '17',
    'type_zzz': '4'
 "02" => 
     'type_a' : '35',
     'type_b' : '39',
     'type_zzz': '60'

如果我正确理解您的问题,您可以使用SQL查询对值进行分组和求和:

$grouped=DB::table('table_name'))
->选择原始('
总和(类型a)为类型a,
总和(类型b)为类型b,
和(类型_z)为类型_z
')
->groupByRaw(‘月(日)’)
->get();
或者,如果不想在每个查询中指定列名,可以在集合中使用和:

$grouped=DB::table('table_name'))
->得到()
->分组依据(功能($item){
返回碳::解析($item->date)->格式('m');
})
->地图(功能组){
$group=$group->toArray();
$summated=[];
$columns=数组_键($group[0]);
数组移位($columns);
foreach($columns作为$column){
$summated[$column]=数组_和(数组_列($group,$column));
}
返回$summated;
});

日期是否实际采用数据库中的格式
d-m-y
,还是实际采用正确的ISO格式
y-m-d
?是否所有值都来自一年(2018年),或者将不同年份的月份分组是您想要的?您使用的是什么数据库管理系统?日期采用正确的ISO格式
Y-m-d
,值将来自不同的年份。我正在使用mysql。谢谢到目前为止,您得到了什么?@moravac,因此,如果值来自不同年份,并且您按月份分组,那么根据您的描述,2017年9月和2018年9月的数据应该合并?我正在尝试第二种解决方案,但我得到以下错误:
array\u keys()预期参数1为array,给定对象
@moravac-我已编辑了我的答案。不幸的是,我没有在任何地方安装Laravel来测试这一点,所以我是从内存中编写的。不走运,
调用未定义的方法stdClass::keys()
好的,回到
数组\u keys()
并将
转换为一个数组。谢谢!小改动:代替:
$summated[$column]=array\u column($group,$column)
需要:
$summated[$column]=array\u sum(array\u column($group,$column))DB::table($id)->get()->groupBy(function($date) {
        return Carbon::parse($date->repdate)->format('m');;
  });