Я пытаюсь создать массивы на основе двух запросов, один в 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
По сути, для каждого артикула я получаю эти записи, а затем мне нужно выполнить эти вычисления по строкам и получить общее количество этих значений для каждого артикула. В отчете будет только одна позиция для каждого артикула.
Поверьте, я согласен! Они только начали использовать MySQL пару лет назад, но каждый день у нас возникают новые задачи, когда мы должны объединить эти источники данных по-новому, и это один из примеров.
Вы показываете два запроса, но как будет выглядеть окончательная структура массива?
Итак, мои первые 2 массива в основном просто возвращают выбранные значения из каждого запроса к базе данных. Последний массив - это то, что я хочу для версии отчета на уровне SKU. Итак, прямо сейчас я хочу, чтобы каждый ключ массива был идентификатором sku, а значение - общим количеством orqtyc, если это имеет смысл. Примерно в середине кода я привел пример. В конце концов, я хочу иметь формулу для средних значений, которая также будет входить в этот массив.
У меня есть распечатка двух других массивов, но я смогу опубликовать их через минуту.
Если ключ уровня строки - это SKU, и каждый из двух исходных массивов имеет только одну «строку» на SKU, тогда это должно быть довольно просто. Просто пройдитесь по двум массивам по одному и установите их данные в 3-м массиве, используя SKU в качестве индекса для строки.
Это может быть сложно, потому что каждый артикул может иметь 100 или более строк в запросе, потому что на самом деле это группа по дилерам и артикулам. Таким образом, я могу получить 7 строк для SKU с идентификатором 1, потому что каждая строка предназначена для другого дилера, который купил эту SKU. Я обновляю свой вопрос, чтобы показать первые 2 массива, если это поможет.
@SloanThrasher Было бы проще, если бы я опубликовал макет того, как я хочу, чтобы весь массив потенциально выглядел для CSV / отчета?
Я обновился с лучшим представлением о моей конечной цели
Вместо того, чтобы строить свежий массив дилеров для каждой строки в skuRslt, добавьте к нему, чтобы, когда вы закончите проходить все skus, вы могли пройти через него и объединить данные между двумя массивами. Вам нужно будет проиндексировать его таким образом, чтобы вы могли объединить данные из двух массивов и выполнить свои вычисления. Кроме того, вы можете рассчитать количество дней в операторе sku SQL. DATEDIFF(NOW(),(start_date - interval 7 day)) as num_days






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