Можно ли сгруппировать по (месяц) и суммировать (каждый столбец) в таблице

+---------+--------+---------+---------+
| date    | type_a | type_b  | type_zzz|
+---------+--------+---------+---------+
|01-01-18 | 12     | 10      |       1 |
|02-01-18 | 2      | 5       |       1 |
|03-01-18 | 7      | 2       |       2 |
|01-02-18 | 13     | 6       |      55 |
|02-02-18 | 22     | 33      |       5 |
+---------+--------+---------+---------+

Привет,

В приведенном выше примере я хотел бы знать, можно ли сгруппировать по месяцам и суммировать каждый столбец при получении результатов в Laravel (таблицы являются динамическими, поэтому для них нет моделей, а также в некоторых таблицах нет столбца 'type_a' other don ' нет 'type_zzz' и т. д ...).

Я хочу получить из приведенной выше таблицы примерно следующее:

"01" =>
    'type_a' : '21',
    'type_b' : '17',
    'type_zzz': '4'
 "02" => 
     'type_a' : '35',
     'type_b' : '39',
     'type_zzz': '60'

Я использую следующий код, чтобы сгруппировать его по месяцам, но я не могу найти решение для возврата суммы по каждому столбцу:

DB::table($id)->get()->groupBy(function($date) {
        return Carbon::parse($date->repdate)->format('m');;
  });

Действительно ли дата в вашей базе данных находится в формате d-m-y или действительно в правильном формате ISO Y-m-d? Все ли значения из одного года (2018) или сгруппированы месяцы из разных лет, что вы хотите? А какую СУБД вы используете?

fubar 19.09.2018 23:48

Даты указаны в правильном формате ISO Y-m-d, а значения относятся к разным годам. Я использую mysql. Спасибо!

moravac 20.09.2018 00:38

что ты так далеко продвинулся?

zjbarg 20.09.2018 00:48

@moravac, поэтому, если значения относятся к разным годам, а вы группируете по месяцам, данные за сентябрь 2017 года и сентябрь 2018 года должны быть объединены в соответствии с вашим описанием?

fubar 20.09.2018 01:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
4
1 206
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если я правильно понимаю ваш вопрос, вы можете сгруппировать и суммировать значения с помощью SQL-запроса:

$grouped = DB::table('table_name')
    ->selectRaw('
        SUM(type_a) AS type_a,
        SUM(type_b) AS type_b,
        SUM(type_z) AS type_z
    ')
    ->groupByRaw('MONTH(date)')
    ->get();

Или, если вы не хотите указывать имена столбцов в каждом запросе, вы можете использовать группа по, array_column и array_sum в своей коллекции:

$grouped = DB::table('table_name')
    ->get()
    ->groupBy(function ($item) {
        return Carbon::parse($item->date)->format('m');
    })
    ->map(function ($group) {
        $group = $group->toArray();
        $summed = [];

        $columns = array_keys($group[0]);
        array_shift($columns);

        foreach ($columns as $column) {
            $summed[$column] = array_sum(array_column($group, $column));
        }

        return $summed;
    });

Я пробую второе решение, но получаю следующую ошибку: array_keys() expects parameter 1 to be array, object given

moravac 20.09.2018 10:59

@moravac - Я отредактировал свой ответ. К сожалению, у меня нигде не установлен Laravel, чтобы можно было это проверить, поэтому я писал его по памяти.

fubar 20.09.2018 11:07

Не повезло, Call to undefined method stdClass::keys()

moravac 20.09.2018 11:15

Хорошо, вернемся к array_keys() и просто приведем group к массиву.

fubar 20.09.2018 11:17

Подхожу ближе, теперь проблема с array_column: array_column() expects parameter 1 to be array, object given

moravac 20.09.2018 11:21

Ржу не могу. Хорошо, обновил снова, чтобы преобразовать group в массив.

fubar 20.09.2018 11:22

Сейчас я получаю результаты, но они сгруппированы по дням и сумма равна 0: Collection {#236 ▼ #items: array:4 [▼ "2018/06" => array:25 [▼ 0 => 0 1 => 0 2 => 0 3 => 0 4 => 0 5 => 0 6 => 0 7 => 0

moravac 20.09.2018 11:26

Можете ли вы dd($group, $group->first()); внутри первой функции map?

fubar 20.09.2018 11:35

Пожалуйста, найдите ss здесь: drive.google.com/file/d/1_QYI2jlBrFaw5_Wj3-T2hBdFR6XLT9qa/…

moravac 20.09.2018 11:45

Спасибо за это. Хорошо, последнее изменение намного более подробное, но я заметил, что необходимо удалить поле даты из массива. Надеюсь, на этот раз это сработает. Если нет, я думаю, вам придется отлаживать себя или ждать, пока кто-то, у кого установлен Laravel, поможет.

fubar 20.09.2018 12:01

Спасибо чувак! Небольшое изменение: вместо: $summed[$column] = array_column($group, $column); должно быть: $summed[$column] = array_sum(array_column($group, $column)); Еще раз большое вам спасибо!

moravac 20.09.2018 12:32

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