Как вернуть общую стоимость каждой компании с помощью Eloquent?

так что у меня есть эта таблица в базе данных

+---------+------------+-------+
| Company |  periods   | value |
+---------+------------+-------+
| a1      | 01-01-2018 |  1000 |
| a1      | 01-02-2018 |   600 |
| a2      | 01-01-2018 |   500 |
| a2      | 01-03-2018 |   500 |
| a3      | 01-01-2018 |   500 |
| a3      | 01-02-2018 |   500 |
| a3      | 01-03-2018 |   500 |
+---------+------------+-------+

и то, что я ожидаю получить по запросу, будет похоже на то, что если я хочу получить общую стоимость всей компании за 01-02-2018, тогда она будет суммировать стоимость для каждой компании до 01-02-2018

+---------+------------+-------+
| Company |  periods   | value |
+---------+------------+-------+
| a1      | 01-02-2018 |  1600 |
| a2      | 01-02-2018 |   500 |
| a3      | 01-02-2018 |  1000 |
+---------+------------+-------+ 

и если я хочу получить форму общей стоимости 01-03-2018, тогда она также суммирует стоимость для каждой компании до 01-03-2018

+---------+------------+-------+
| Company |  periods   | value |
+---------+------------+-------+
| a1      | 01-03-2018 |  1600 |
| a2      | 01-03-2018 |  1000 |
| a3      | 01-03-2018 |  1500 |
+---------+------------+-------+ 

как это сделать на красноречивом?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте groupBy:

$point_history = Model::select(['Company', 'periods',DB::raw('sum(value) as value')])
                ->groupBy('Company')
                ->having('periods','01-02-2018')
                ->get();

напишите условие периодов в наличии в качестве вашего требования

я получаю эту ошибку SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1055 Выражение № 2 списка SELECT не входит в предложение GROUP BY и содержит неагрегированный столбец laravelvue.report.periods, который функционально не зависит от столбцов в предложении GROUP BY ; это несовместимо с sql_mode = only_full_group_by

PamanBeruang 27.09.2018 06:12

отредактируйте вопрос и опубликуйте свой код, чтобы каждый мог проверить.

Dhruv Raval 27.09.2018 07:05
$from = date('2018-01-01');
$to = date('2018-02-01');

$data = Model::select(DB::raw('Company', 'periods', 'sum(value) as total_value'))
                ->groupBy('Company')
                ->whereBetween('periods', [$from, $to])
                ->get();

Можете ли вы попробовать приведенный выше код? Дата $form должна быть самой первой датой, с которой вы начали запись. Вы должны изменить дату $to, чтобы время от времени получать общее летнее время.

Ответ принят как подходящий

проблема такая,

когда вы группируете строки по столбцу «значение», какое значение в строке результатов будет иметь значение «периоды»? вы знаете, что до того, как вы сгруппировали, было несколько различных значений «периода». теперь среди них, какое значение «периода» MySQL должен поместить в строку результатов ...?

так что это не разрешено 'sql_mode = only_full_group_by'

либо вам нужно удалить столбец «периоды» из выбранного запроса, либо вы можете агрегировать столбец «периоды».

Возможные решения.

$maxDate = // whatever date you wanna compare with.

$summery = Model::select(DB::row('Company, max(periods) AS periods, sum(value) AS value'))
    ->groupBy('Company')
    ->where('periods', '<=', $maxDate)
    ->get();

хорошо, я думаю, что этот код будет работать, но мне просто интересно, когда я добавляю, например: столбец created_at в запросе выбора внутри DB :: row, тогда я получу 1055 Выражение # 2 из списка SELECT не в предложении GROUP BY и содержит ошибку неагрегированного столбца ... так что мне нужно объединить все остальные столбцы, кроме столбца компании?

PamanBeruang 27.09.2018 09:28

это ошибка, на которую я указал в столбце "периоды". либо удалите столбец «периоды» из выбранного запроса, либо используйте max (период).

Tharaka Dilshan 27.09.2018 09:33

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

PamanBeruang 27.09.2018 09:36

это нормально, потому что вы сгруппированы по компаниям. так что вы можете иметь столбец названия компании для запроса выбора. потому что для каждой строки выбора есть "ТОЧНОЕ", "НЕПРЕРЫВНОЕ" название компании.

Tharaka Dilshan 27.09.2018 09:40

о, ладно, тогда я думаю, что это достаточно хорошо ... так что мне просто нужно добавить max (column_name) как column_name ко всем остальным столбцам ....

PamanBeruang 27.09.2018 09:46

точно. max или любое другое разумное агрегирование.

Tharaka Dilshan 27.09.2018 09:50

Другие вопросы по теме