【问题标题】:Total of numerical column in looped table (not total of query)循环表中数字列的总数(不是查询的总数)
【发布时间】:2016-09-24 04:01:16
【问题描述】:

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

我已经为此困扰了好几个星期。一直在网上研究,无法弄清楚。请帮忙。

请务必注意 - 我试图获取总数的列未存储在我的 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 并在填充时使用数组来保存所有 $subtotal 但我完全被难住了。

衷心感谢。如果您需要我澄清或帮助使其更准确,请告诉我。

【问题讨论】:

  • 我不完全理解你的问题。我已经回答了你的问题,因为这对我来说似乎很简单。希望尽快得到你的反馈

标签: mysql arrays sum


【解决方案1】:

我已经阅读了你的问题。这个问题对我来说似乎很简单,但你的代码都搞砸了。我的理解是你的 total 将是所有小计值的总和,所以

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 代码现在将非常简单,因为现在您只需要一个查询而不是四个查询。

【讨论】:

  • 基兰,感谢您的帮助和建议。我仍在学习更好、更正确的方法来使我的代码更精确,非常感谢您上次清理我的代码的建议。
  • 我认为这个问题的答案很简单,但我无法完全理解它。 -- 我想让你知道我看到了你的答案,我想在今天或明天尝试实施它(这个周末的工作项目需要我的时间),并且肯定会让你知道它对我的工作方式。到目前为止唯一的问题:我是否需要使用 TOTAL: '.$total.' 在 中初始化总变量($total=0 等) ?
  • @userK1400 继续努力,永不放弃。 $total 保存所有小计的总和,因此需要在获取小计的循环上方对其进行初始化。循环执行后,$total 现在保存所有小计的总和。现在可以使用它来显示TOTAL :.'$total.'。试试这个,这样你会学得更好。如果卡住了,我们会帮助你:)
  • 非常感谢!!!我刚刚尝试了您提供的解决方案,并且效果很好。我不敢相信这很容易。哈哈。真诚地感谢您的善意和帮助。
  • 另外 - 我很好奇另外一个我无法解决的问题。我不确定是否可以在我提出的新问题中标记您,或者您是否有时间,但我很想看看您是否有建议——关于在表单提交时不刷新页面。再次对上述问题表示诚挚的感谢!
猜你喜欢
相关资源
最近更新 更多
热门标签