так что у меня есть эта таблица в базе данных
+---------+------------+-------+
| 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 |
+---------+------------+-------+
как это сделать на красноречивом?
Используйте groupBy:
$point_history = Model::select(['Company', 'periods',DB::raw('sum(value) as value')])
->groupBy('Company')
->having('periods','01-02-2018')
->get();
напишите условие периодов в наличии в качестве вашего требования
отредактируйте вопрос и опубликуйте свой код, чтобы каждый мог проверить.
$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 и содержит ошибку неагрегированного столбца ... так что мне нужно объединить все остальные столбцы, кроме столбца компании?
это ошибка, на которую я указал в столбце "периоды". либо удалите столбец «периоды» из выбранного запроса, либо используйте max (период).
ох .... тогда как насчет того, если у этого стола есть отношения? скажем, это относится к таблице компаний, которую я хочу показать в этом запросе?
это нормально, потому что вы сгруппированы по компаниям. так что вы можете иметь столбец названия компании для запроса выбора. потому что для каждой строки выбора есть "ТОЧНОЕ", "НЕПРЕРЫВНОЕ" название компании.
о, ладно, тогда я думаю, что это достаточно хорошо ... так что мне просто нужно добавить max (column_name) как column_name ко всем остальным столбцам ....
точно. max или любое другое разумное агрегирование.
я получаю эту ошибку SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1055 Выражение № 2 списка SELECT не входит в предложение GROUP BY и содержит неагрегированный столбец laravelvue.report.periods, который функционально не зависит от столбцов в предложении GROUP BY ; это несовместимо с sql_mode = only_full_group_by