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

标签 php mysql laravel eloquent laravel-5.6

我有一个我想不通的问题。仅供引用,我正在使用 Laravel 5.6

我有一个offers 表和一个requests 表;

offers-table
- id
- quotation_amount
- ...

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

这是一对多的关系。澄清一下:一个offer可以被请求多次,一个request只属于一个offer。 (关系设置正确。)

现在我需要知道 quotation_amount 每月总计第一个请求(由日期列选择)领先确定要分组的月份。其他请求基本上应该被忽略。

我们需要这个的原因是,我们可以看到与我们向客户提供的产品相比,我们销售了多少。如果我们在一个月内对产品的报价为 1.000.000,但我们在同一个月仅售出 100.000 (10%),则说明销售部门出了问题,或者我们的报价太贵了:)。

因此,为了获取要与我进行比较的数据,我有一个 projects 表,其中有一个 contract_sumsale_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

关于php - 如何获取按月分组的列的总和,其中日期列是一个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53842094/

相关文章:

php - 我是否需要将 _gaq.push( ['_trackEvent' ..... 放在我的 PHP 代码中的 <script> 标签内?

javascript - 如何停止提交并提醒用户用JS选择的问题少于10个问题

php - 使用 HTML 日期范围表单数据在 MySQL 查询中选择日期范围

mysql - 如何在 MYSQL 选择查询中进行多次计数?

mysql - 使用 MySQL 选择父项和子项

php - Laravel 查询生成器 - groupBy、map、sortBy/orderBy

php - 拉拉维尔 5 : API routes + wildcard route results in unexpected behavior

php - 无法在数据库中保存 CHECKBOX 字段类型 - Joomla 2.5

tynemce 的 mysql 表结构

javascript - 单词的阿拉伯语句子在数据表上颠倒了 pdfhtml5 "pdfmake"