php—如何获取按月份分组的列的总和,其中日期列是一个关系

cetgtptt  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(387)

我有个问题想不通。仅供参考,我用的是拉维5.6
我有一个 offers 表和a requests 表格;

offers-table
- id
- quotation_amount
- ...

requests-table
- id
- offer_id
- date
- ...

这是一对多的关系。澄清:一个要约可以被多次请求,而一个请求只属于一个要约(关系设置正确。)
现在我需要知道 quotation_amount 每月。第一个请求(由“日期”列选择)将导致确定要分组的月份。其他的请求基本上应该被忽略。
我们需要这样做的原因是,我们可以看到我们的销售额相比,我们提供给客户。如果一个月内我们的产品报价为1.000.000,但同一个月内我们的售价仅为10万(10%),说明销售部门出了问题,或者我们的报价太贵了:)。
所以为了得到要比较的数据,我有一个 projects -具有 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();

但上述方法不起作用,因为如果两个月内有两个请求只提供一个报价,那么这两个月都会计算在内。
谁能帮我或给我指出正确的方向?

xfb7svmp

xfb7svmp1#

尝试使用原始查询:

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

相关问题