如何获取按月分组的列的总和,其中日期列是一个关系
Howto get the sum of a column, grouped by month, where the date column is a relationship
我有一个无法解决的问题。仅供参考,我正在使用 Laravel 5.6
我有一个 offers
table 和一个 requests
table;
offers-table
- id
- quotation_amount
- ...
requests-table
- id
- offer_id
- date
- ...
这是一对多的关系。澄清一下:一个offer可以被请求多次,一个request只属于一个offer。 (关系设置正确。)
现在我需要知道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();
但是以上是不行的,因为如果在两个不同的月份有两个request只为一个offer,那么两个月都会被计算。
谁能帮助我或指出正确的方向?
尝试使用原始查询:
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
我有一个无法解决的问题。仅供参考,我正在使用 Laravel 5.6
我有一个 offers
table 和一个 requests
table;
offers-table
- id
- quotation_amount
- ...
requests-table
- id
- offer_id
- date
- ...
这是一对多的关系。澄清一下:一个offer可以被请求多次,一个request只属于一个offer。 (关系设置正确。)
现在我需要知道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();
但是以上是不行的,因为如果在两个不同的月份有两个request只为一个offer,那么两个月都会被计算。
谁能帮助我或指出正确的方向?
尝试使用原始查询:
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