php - 如何获取按月分组的列的总和,其中日期列是关系
问题描述
我有一个我无法弄清楚的问题。仅供参考,我正在使用 Laravel 5.6
我有一张offers
桌子和一张requests
桌子;
offers-table
- id
- quotation_amount
- ...
requests-table
- id
- offer_id
- date
- ...
这是一对多的关系。澄清:可以多次请求报价,并且请求仅属于一个报价。(关系设置正确。)
现在我需要知道每月的总和。第一个请求(由日期列选择)在确定要分组的月份时处于领先地位。其他请求基本上应该被忽略。quotation_amount
我们需要这个的原因是,我们可以看到与我们提供给客户的产品相比,我们销售了多少。如果我们在一个月内以 1.000.000 的价格提供产品,但在同一个月仅以 100.000 (10%) 的价格出售,那么销售部门有问题或者我们的报价太贵了 :)。
因此,为了让数据与我进行比较,我有一个projects
-table 有一个contract_sum
和sale_date
列。这要容易得多,因为我可以做到这一点;
$sales['projects'] = array_replace(
array_fill_keys(range(1, 12), 0), $projects->groupBy('sale_date.month')->map(function($projects) {
return $projects->pluck('contract_sum')->sum();
})->toArray()
);
上面代码的输出;
Array
(
[1] => 760335
[2] => 1154054
[3] => 683762
//... untill 12
)
但是要获得报价报价金额的相同输出,我需要来自关系的日期,这可能有多个结果,我不知道该怎么做。我还尝试了以下类似的方法和不同的变体;
$offers = Offer::with(['requests' => function($query) {
$query->orderBy('date')->take(1);
}])->whereHas('requests', function($query) {
$query->whereMonth('date', $month);
})->get();
但以上不起作用,因为如果在两个不同的月份内有两个请求仅针对一个报价,则将在两个月内计算在内。
谁能帮助我或为我指明正确的方向?
解决方案
尝试使用原始查询:
SELECT MONTH(r.first_date) AS offer_month, SUM(o.quotation_amount) as total
FROM offers o INNER JOIN
(
SELECT offer_id, MIN(date) first_date FROM requests r
GROUP BY offer_id
) r
ON o.id=r.offer_id
WHERE YEAR(r.first_date)=...
GROUP BY offer_month
推荐阅读
- javascript - 将 Javascript 变量值插入 HTML 标记 id 字段
- tensorflow - 在 Tensorflow 2.4 中使用 Densenet121 的 Logits 问题
- python - 尝试调用 image_viewer 模块时获取“_tkinter.TclError:图像“pyimage1”不存在”
- ios - Swift - 如何以编程方式访问 collectionView 的 targetContentOffset.pointee.y
- javascript - DiscordJS - 异步响应消息
- scala - Spark Zepplin 在数据集上抛出 NPE
- sql - SQL:选择里面选择?
- python - 找出一个数字末尾有多少个零(数字为 0 时字符串索引超出范围错误)
- javascript - 如何使用通过 JS 控制台添加的脚本来修改 Angular 页面中的表单内容以保存更改?
- flutter - Upwork 将 Flutter App 开发到 Play Store 和 Iphone Apps Store