我正在开展一个项目,要求我生成类似于此的报告:
Category Total Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
-----------------------------------------------------------------------
Category 1 97 10 10 10 10 10 5 10 10 7 5 5 5
Category 2 120 10 10 10 10 10 10 20 10 5 5 10 10
Category 3 5 0 0 0 3 0 2 0 0 0 0 0 0
此报告需要从与此类似的数据生成:
id category_id type year month amount
----------------------------------------------------------
1 1 16 2016 1 4
2 1 23 2016 1 6
3 1 76 2016 2 3
4 1 27 2016 2 3
5 1 18 2016 2 4
在报告中,每个月的数字只是该特定类别,年份和月份的amount
的总和。我可以通过查询每个月和每个类别的数据库来做到这一点,但是如果我需要生成一个包含大约一百个类别的报告,这种类型的方法不能很好地扩展,因为它将需要超过1,200个查询(100个类别X 12个月)!
有关如何提高效率的任何建议吗?
谢谢!
答案 0 :(得分:1)
解决方案是按两列分组。我添加了必要的代码以根据需要格式化结果。
Item::where('year', $year)
->groupBy('month', 'category_id')
->selectRaw('sum(amount) as sum, month, category_id')
->orderBy('category_id')
->orderBy('month')
->get()
->groupBy('category_id')
->map(function($item){
$item = $item->pluck('sum', 'month');
$item['total'] = $item->sum();
return $item;
});
答案 1 :(得分:1)
这是你要找的吗?
Category::where('year', 2016)
->select('month', 'year', DB::raw('SUM(amount) as amountTotal'))
->groupBy('month', 'year')
->get();