循环表中的数字列总数(不是查询总数)

时间:2016-09-24 04:01:17

标签: mysql arrays sum totals

提前感谢您提供详细的帮助和回复。

我已经被困了几个星期了。一直在线研究,无法弄清楚这一点。请帮忙。

重要的是要注意 - 我试图获得总数的列不存储在我的sql数据库中。 SELECT SUM不适用于此。我也不想将SUBTOTAL列写入sql - 因为如果我需要更改小时数或速率(如果有文书错误),我宁愿只更改1字段,而不是2.

这是我的表格的样子,从sql查询填充: table looks like

如果表格中显示 TOTAL ,我需要将其添加到其上方的列中并填充总计。

这是我的代码 - 它很长,因为我会包含所有内容,以防万一你需要它。

$staffquery = mysqli_query($con, "SELECT * FROM kmis_transcribers WHERE transcriber_projectid = '$projectinvoiceid ' ORDER BY transcriber_calltime ASC");

$staffcount = mysqli_num_rows($staffquery);
for($i=0; $i<$staffcount; $i++) {
$staffarray = mysqli_fetch_array($staffquery);
$staffid = $staffarray['transcriber_id'];
$staffregid = $staffarray['transcriber_registryid'];
$staffposition = $staffarray['staff_position'];
$staffcalltime = $staffarray['transcriber_calltime'];
$staffrate = $staffarray['staff_rate'];
$staffhours = $staffarray['transcriber_hours'];
$staffovertime = $staffarray['transcriber_overtime'];


echo('<tr>

    <td align="center" style="border:1px solid #000000; padding:3px">$'.$staffrate.'</td>
    <td align="center" style="border:1px solid #000000; padding:3px">');

$invoicequery = mysqli_query($con, "SELECT * FROM kmis_invoices WHERE invoice_staffid='$staffid'");
  while ($invoicearray = mysqli_fetch_array($invoicequery)) {
           echo(''.$invoicearray['invoice_hours'].'');
}
   echo('</td>
         <td align="center" style="border:1px solid #000000; padding:3px">');

$invoicequery = mysqli_query($con, "SELECT * FROM kmis_invoices WHERE invoice_staffid='$staffid'");
  while ($invoicearray = mysqli_fetch_array($invoicequery)) {
           echo(''.$invoicearray['invoice_overtime'].'');
}
      echo('</td> 
        <td align="center" style="border:1px solid #000000; padding:3px">');

$invoicequery = mysqli_query($con, "SELECT * FROM kmis_invoices WHERE invoice_staffid='$staffid'");
  while ($invoicearray = mysqli_fetch_array($invoicequery)) {
           $invoicehours= $invoicearray['invoice_hours'];
           $invoiceovertime= $invoicearray['invoice_overtime'];

    $subtotal = ($invoicehours*$staffrate)+($invoiceovertime*$staffrate*1.5);
    $subtotalformat = number_format((float)$subtotal, 2, '.', '');

      echo('$'.$subtotalformat.'');
} 
   echo('</td>
   </tr>');
}
    echo('<tr>
        <td align="center" style="border:1px solid #000000; padding:3px"></td>
        <td align="right" style="border:1px solid #000000; padding:3px" colspan="4"><b>TOTAL DUE:</b></td>
        <td align="center" style="border:1px solid #000000; padding:3px"><b>TOTAL</b></td>
        </tr>

您可以看到我用于创建小计列的公式使用了四种不同的查询 - 来自发票和员工。一些工作人员具有不同的费率,因此小计基于可能在行与行之间完全不同的数据。

我认为答案在于 array_sum ,并且当他们填充时使用数组来保存所有$小计,但我完全难倒了。

真诚地感谢你。如果您需要我澄清或帮助使其更精确,请告诉我。

1 个答案:

答案 0 :(得分:2)

我已经阅读了你的问题。这个问题对我来说似乎很简单,但是你的代码都搞砸了。我明白你的总数将是所有小计值的总和,所以< / p>

Total= 40$ + 108$ = 148$ //from your shown data in fig

在for循环之外初始化变量$ total

  $total=0;
  for($i=0; $i<$staffcount; $i++) {

计算小计值后,将其添加到您的总计中,如下所示

$subtotal = ($invoicehours*$staffrate)+($invoiceovertime*$staffrate*1.5);
$total=$total + $subtotal; 
$subtotalformat = number_format((float)$subtotal, 2, '.', '');

最后将计算出的$ total的值放在结果中

 echo('<tr>
        <td align="center" style="border:1px solid #000000; padding:3px"></td>
        <td align="right" style="border:1px solid #000000; padding:3px" colspan="4"><b>TOTAL DUE:</b></td>
        <td align="center" style="border:1px solid #000000; padding:3px"><b>TOTAL : '.$total.'</b></td>
        </tr>

你的PHP代码显得非常冗长而且搞砸了,所以我建议你尝试这个查询来缩短它。

SELECT 
    t1.transcriber_id staff,
    t1.staff_position position,
    t1.staff_rate Rate,
    t2.invoice_hours hours,
    t2.invoice_overtime 'OT x 1.5',
    (t2.invoice_hours * t1.staff_rate) + (t2.invoice_overtime * t1.staff_rate * 1.5) subtotal
FROM
    kmis_transcribers t1
        JOIN
    kmis_invoices t2 ON (t1.transcriber_id = t2.invoice_staffid)
WHERE
    t1.transcriber_projectid=1 //$projectinvoiceid in your case

上面的查询将返回您想要的视图,现在您的PHP代码将变得非常简单,而不是只需要一个查询的四个查询。