Я думаю, что ваша проблема лежит в $ finalData, где вы храните одни и те же результаты дважды. (конечно же из разных таблиц).
первый запрос создает результат
$finalData = array(
'10R46' => array(0 => array('part_no' => 10R46, 'sale_qty' => 2)),
'10R91' => array(0 => array('part_no' => 10R91, 'sale_qty' => 1)),
'10M95' => array(0 => array('part_no' => 10M95, 'sale_qty' => 2))
);
затем вы запускаете второй запрос и снова ДОБАВЛЯЕТЕ к окончательным данным с этим $finalData[$row['part_no']][] = $row;
так что $ finalData теперь что-то вроде
$finalData = array(
'10R46' => array(0 => array('part_no' => 10R46, 'sale_qty' => 2), 1 => array('part_no' => 10R46, 'csale_qty' => 2)),
'10R91' => array(0 => array('part_no' => 10R91, 'sale_qty' => 1), 1 => array('part_no' => 10R91, 'csale_qty' => 1)),
'10M95' => array(0 => array('part_no' => 10M95, 'sale_qty' => 3), 1 => array('part_no' => 10M95, 'csale_qty' => 3))
);
По этой причине вы удваиваете цикл, а также получаете двойной результат.
Так что я бы объединил запросы.
$sql="SELECT
jobc_parts_p.part_no,
SUM(jobc_parts_p.issued_qty) AS sale_qty,
SUM(jobc_consumble_p.issued_qty) AS csale_qty ## this part was added
FROM `jobc_parts_p`
LEFT JOIN `jobc_consumable_p` ON (jobc_consumable_p.part_no = jobc_parts_p.part_no) ## this part was added
WHERE DATE_FORMAT(jobc_parts_p.date_time,'%Y-%m-%d') BETWEEN '".$f."' AND '".$t."'
GROUP BY jobc_parts_p.part_no";
и теперь ваш результат должен выглядеть примерно так без второго запроса
$finalData = array(
'10R46' => array(0 => array('part_no' => 10R46, 'sale_qty' => 2, 'csale_qty' => 2)),
'10R91' => array(0 => array('part_no' => 10R91, 'sale_qty' => 1, 'csale_qty' => 1)),
'10M95' => array(0 => array('part_no' => 10M95, 'sale_qty' => 2, 'csale_qty' => 3))
);
также, если вы не ожидаете, что будет две строки с одинаковым part_no, вы можете изменить
$finalData[$row['part_no']][] = $row; -> $finalData[$row['part_no']] = $row;
Так что вам не нужно делать двойной цикл.