Как получить сумму столбца, сгруппированного по месяцам, где столбец даты является отношением - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть проблема, которую я не могу понять.Кстати, я использую 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, в которой есть столбцы 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();

Но выше не работает, потому что если есть два запроса в два разных месяца только для одного предложения, он будет засчитан в обоихмесяцев.

Кто может мне помочь или указать мне правильное направление?

1 Ответ

0 голосов
/ 19 декабря 2018

попробуйте использовать необработанный запрос:

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
...