Оптимизация массива для получения суммы для каждого ключа

Я пытаюсь создать массивы на основе двух запросов, один в mysql, один на db2. Я построил основные массивы, первый из которых связан с информацией о продукте, а второй - с информацией о клиентах, но у них есть некоторые общие значения.

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

На данный момент я просто попытаюсь вывести отчет или файл csv для каждого sku_id из первого запроса и общего числа / количества из второго запроса.

Второй запрос / массив содержит несколько атрибутов для каждого продукта / клиента.

(
[1] => 2
)
Array
(
[1] => 5
)
Array
(
[1] => 14
)

По сути, я вытащил три записи из первой таблицы для sku_id '1' и сопоставил эти три записи в db2 для одного и того же sku. Каждый элемент соответствует покупателю, поэтому в этой структуре сказано, что «покупатель A имел 2 sku_id 1, покупатель B имел 5 sku_id 1, а покупатель C имел 14 sku_id 1».

Для целей отчета каждая строка будет для каждого артикула, поэтому я хочу вместо этого вывести это как:

array
(
[1] => 21
)

Показывая это в целом, sku_id 1 имеет в общей сложности 21. Так что я все еще хочу сохранить свои первоначальные массивы структурированными, как они есть, но я хочу изменить мой последний массив, чтобы просто предоставить мне позиции для отчета.

Как я могу это сделать?

$skuQuery = "
    SELECT 
        sku_id,
        dealer_id,
        locations,
        s.sku_group_id as groupID,
        s.frame as frame,
        s.cover1 as cover,
        s.color1 as color,
        start_date - interval 7 day as start_date
    from products p
    inner join skus s on p.sku_id = s.id
    where curdate() between p.start_date and p.expire_date
    group by sku_id, dealer_id
    limit 3";

$skuRslt = mysqli_query($conn,$skuQuery);
while($skuRow = mysqli_fetch_assoc($skuRslt)){

    $skuResult['sku_id'] = $skuRow;

    $dealerQuery = "
        SELECT
              cstnoc,
              sum(orqtyc) as TotalQTY
          from table
            where cstnoc = {$skuRow['dealer_id']}
            AND framec = {$skuRow['frame']}
              AND colr1c = {$skuRow['color']}
              AND covr1c =  {$skuRow['cover']}
              AND extd2d >= " . str_replace('-', '', $skuRow['start_date']) . "
        group by cstnoc, framec
    ";

    $dealerRslt = odbc_exec($DB2Conn, $dealerQuery);

    $dealerResult = [];
    foreach($skuResult as $skuRow){
        while($dealerRow = odbc_fetch_array($dealerRslt)){
                if ( !isset($dealerResult[$dealerRow['CSTNOC']]) ) {
                    $dealerResult[$dealerRow['CSTNOC']] = 0;
                }
                $dealerResult[$dealerRow['CSTNOC']] += $dealerRow['TOTALQTY'];
        }
    }

    $skuTots = array_fill_keys(array_unique(array_column($skuResult, 'sku_id')), 0);
    foreach ($skuResult as $rec) {
        $skuTots[$rec['sku_id']] += $dealerResult[$rec['dealer_id']];
    }
    print_r($skuTots);
}

ОБНОВИТЬ:

Это распечатка моих первых двух массивов:

    Array
(
    [0] => Array
        (
            [sku_id] => 1
            [dealer_id] => 1976
            [locations] => 1
            [groupID] => 1
            [frame] => 1051
            [cover] => 1150
            [color] => 99
            [start_date] => 2018-03-
        )


    [1] => Array
        (
            [sku_id] => 1
            [dealer_id] => 5400
            [locations] => 1
            [groupID] => 1
            [frame] => 1051
            [cover] => 1150
            [color] => 99
            [start_date] => 2017-04-
        )


    [2] => Array
        (
            [sku_id] => 1
            [dealer_id] => 11316
            [locations] => 1
            [groupID] => 1
            [frame] => 1051
            [cover] => 1150
            [color] => 99
            [start_date] => 2017-02-
        )


)
Array
(
    [0] => Array
        (
            [CSTNOC] => 1976
            [TOTALQTY] => 2
        )


    [1] => Array
        (
            [CSTNOC] => 5400
            [TOTALQTY] => 5
        )


    [2] => Array
        (
            [CSTNOC] => 11316
            [TOTALQTY] => 14
        )
)

И вот пример моего конечного результата, которого я пытаюсь достичь:

В приведенном ниже примере sku_id, groupID и location будут получены непосредственно из первого запроса. Дни - это количество дней между start_date (из запроса 1) и curDate (). Кол-во - это orqtyc из запроса 2, а Среднее - вычисление на основе местоположений, дней и кол-во. Каждая строка основана на разных покупателях, поэтому, несмотря на то, что приведенный ниже пример относится к одному артикулу, строки обозначают разных клиентов с разными местоположениями, количеством и т. д.

SKU_id    |   groupID   | locations (n) | Days (x) | Qty(q) | Average (x/(q/n))
--------------------------------------------------------------------------------
123              1            3             120         15           24
123              1            2             12          6            4

Тогда в отчете или CSV будет отображаться только одна позиция для вышеуказанного:

SKU   |   Group   |   Average Days   |   Total units sold
123   |     1     |        28        |          21   

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

Тот, кто разработал систему, использующую две разные системы БД для хранения данных, которые должны быть объединены, должен вам пожизненный запас таблеток от головной боли !!

Sloan Thrasher 10.04.2018 01:49

Поверьте, я согласен! Они только начали использовать MySQL пару лет назад, но каждый день у нас возникают новые задачи, когда мы должны объединить эти источники данных по-новому, и это один из примеров.

Geoff_S 10.04.2018 01:50

Вы показываете два запроса, но как будет выглядеть окончательная структура массива?

Sloan Thrasher 10.04.2018 01:56

Итак, мои первые 2 массива в основном просто возвращают выбранные значения из каждого запроса к базе данных. Последний массив - это то, что я хочу для версии отчета на уровне SKU. Итак, прямо сейчас я хочу, чтобы каждый ключ массива был идентификатором sku, а значение - общим количеством orqtyc, если это имеет смысл. Примерно в середине кода я привел пример. В конце концов, я хочу иметь формулу для средних значений, которая также будет входить в этот массив.

Geoff_S 10.04.2018 01:58

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

Geoff_S 10.04.2018 02:00

Если ключ уровня строки - это SKU, и каждый из двух исходных массивов имеет только одну «строку» на SKU, тогда это должно быть довольно просто. Просто пройдитесь по двум массивам по одному и установите их данные в 3-м массиве, используя SKU в качестве индекса для строки.

Sloan Thrasher 10.04.2018 02:14

Это может быть сложно, потому что каждый артикул может иметь 100 или более строк в запросе, потому что на самом деле это группа по дилерам и артикулам. Таким образом, я могу получить 7 строк для SKU с идентификатором 1, потому что каждая строка предназначена для другого дилера, который купил эту SKU. Я обновляю свой вопрос, чтобы показать первые 2 массива, если это поможет.

Geoff_S 10.04.2018 02:46

@SloanThrasher Было бы проще, если бы я опубликовал макет того, как я хочу, чтобы весь массив потенциально выглядел для CSV / отчета?

Geoff_S 10.04.2018 03:12

Я обновился с лучшим представлением о моей конечной цели

Geoff_S 10.04.2018 04:32

Вместо того, чтобы строить свежий массив дилеров для каждой строки в skuRslt, добавьте к нему, чтобы, когда вы закончите проходить все skus, вы могли пройти через него и объединить данные между двумя массивами. Вам нужно будет проиндексировать его таким образом, чтобы вы могли объединить данные из двух массивов и выполнить свои вычисления. Кроме того, вы можете рассчитать количество дней в операторе sku SQL. DATEDIFF(NOW(),(start_date - interval 7 day)) as num_days

Sloan Thrasher 10.04.2018 13:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
10
32
0

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