Вам нужно показать отдельные строки расходов, а также все итоги? Если нет, вы можете сгруппировать по столбцу supplierinv и суммировать суммы:
select supplierinv, sum(amount) as invoice_amount
from expenses group by supplierinv
тогда вы можете просто добавить все значения invoice_amount на стороне клиента, чтобы получить общий итог.
если вам нужна каждая строка расходов, вы можете довольно легко выполнить объединение счетов на стороне клиента:
$invtotals = array();
$grand_total = 0;
foreach (getexpenses() as $row) {
$supplierinv = $row['supplierinv'];
if (!array_key_exists($supplierinv, $invtotals)) {
$invtotals[$supplierinv] = 0;
}
$invtotals[$supplierinv] += $row['amount'];
$grand_total += $row['amount'];
}
другой подход, если вы хотите показать таблицу разделенной на счета-фактуры, это просто убедиться, что результаты упорядочены поставщикомinv, а затем:
$grand_total = 0;
$invoice_total = 0;
$current_invoice = -1;
foreach (getexpenses() as $row) {
if ($current_invoice > 0 && $current_invoice != $row['supplierinv']) {
show_invoice_total($current_invoice, $invoice_total);
$grand_total += $invoice_amount;
$current_invoice = $row['supplierinv'];
$invoice_total = 0;
}
$invoice_total += $row['amount'];
show_expense($row);
}
if ($current_invoice > 0) {
show_invoice_total($current_invoice, $invoice_total);
$grand_total += $invoice_amount;
}
show_grand_total($grand_total);
Вы можете сделать так, чтобы база данных выполняла агрегирование для каждого счета-фактуры и итоговой суммы следующим образом:
select date, supplierinv, amount,
sum(amount) over(partition by supplierinv) as invoice_amount,
sum(amount) over()
from expenses
хотя вам еще нужно выполнить некоторую постобработку, чтобы отобразить это разумно, так что в действительности это ничего не дает.