【问题标题】:Calculate average fuel last 30 days计算过去 30 天的平均燃料
【发布时间】:2014-05-03 13:11:11
【问题描述】:

我有一个脚本可以计算过去 30 天的平均油耗,但一些用户报告计算错误。

这就是我所拥有的:

//Calculate the total km for the last 30 days
    $result = mysqli_query($con,"SELECT MIN(km) AS minikm, MAX(km) AS maxkm FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $mileage = $row['maxkm'] - $row['minikm'];}

//Sum up all the Liters of diesel
    $result = mysqli_query($con,"SELECT SUM(liter) AS totalfuel FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $totalfuel = $row['totalfuel'];} 

$averagefuel = $totalfuel / $mileage * 10;

在解决此问题时,我注意到我不应该在计算的第一条记录中包含升。只有总公里数。那么我该怎么做呢?

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集
  • 对不起,jquery标签是我的一个错误。
  • 可能与问题无关,但请注意 SQL 注入(例如 $_Cookie 部分)

标签: php mysql average


【解决方案1】:

如果我必须推测用户的想法,问题是一个月的燃料输入与当月的燃料消耗有些无关。换句话说,水箱可能开始空满或介于两者之间。而且,它可能会以空、满或介于两者之间的方式结束。

这意味着您的计算可能会在任一侧最多加满油箱。

现在,这可能会因特定情况而得到缓解。例如,也许这些车辆每天都在行驶,他们的油箱在一天结束时被加满。因此,在午夜,您可以合理地假设水箱已满。如果是这种情况,我会感到惊讶,因为汽车中的燃料库存需要花钱。他们可以聘请我作为顾问来改善他们的资产负债表;)(仅作记录,这不是我的专长)。

作为一个小提示,您可以在 SQL 中进行完整的计算。您不需要使用两个查询或任何客户端计算:

SELECT 10 * SUM(liter) / (MAX(km) - MIN(km)) as AvgFuel
FROM diesel
WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid'].";

【讨论】:

  • 这看起来比我的查询要好得多。我会试试的。这是我们货运公司司机的一个小型 Web 应用程序。我们总是把我们的坦克装满。每天或每 2 天。当我将我的平均油耗与我在 iPhone 上使用的油耗进行比较时,我发现计算结果有所不同。不同之处在于 iphone 应用程序不包括 sql 查询选择的第一条记录中的柴油升数。我的有,但什么是正确的?我的网络应用程序还是 iPhone 应用程序? :)
  • @RogerAndersen。 . .可能介于两者之间。给定日期之后的第一次“填充”可能是在日期之前、日期之后或介于两者之间的某个地方完全使用的燃料。鉴于您的业务实践,您也许能够弄清楚这一点。在 Stack Overflow 上,这将是一个不同的问题,有样本数据和期望的结果。
【解决方案2】:

我认为您需要一直添加 $mileage。试试这个:

//Calculate the total km for the last 30 days
$mileage = 0;
    $result = mysqli_query($con,"SELECT MIN(km) AS minikm, MAX(km) AS maxkm FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $mileage += $row['maxkm'] - $row['minikm'];}

//Sum up all the Liters of diesel
    $result = mysqli_query($con,"SELECT SUM(liter) AS totalfuel FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $totalfuel = $row['totalfuel'];} 

$averagefuel = $totalfuel / $mileage * 10;

Gordon Linoff 为您提供了很好的解决方案。尝试使用这个:

//Calculate the total km for the last 30 days
$mileage = 0;
$result = mysqli_query($con,
"SELECT 10 * SUM(liter) / (MAX(km) - MIN(km)) as AvgFuel
FROM diesel
WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']);
$averagefuel = $steps = 0; 
while($row = mysqli_fetch_array($result)){ 
    $averagefuel += $row['AvgFuel']; 
    $steps++; 
} 
$averagefuel = $averagefuel/$steps;

【讨论】:

  • 我注意到在故障排除时我不应该在第一条记录中包含升。不知道该怎么做。
  • 什么是第一条记录?您能否添加您在故障排除中获得的数据,我不太了解您。 Gordon Linoff 也为您提供了很好的解决方案。您需要使用他的查询然后 $averagefuel = $steps = 0; while($row = mysqli_fetch_array($result)){ $averagefuel += $row['AvgFuel']; $步骤++; } $averagefuel = $averagefuel/$steps;
  • 我正在使用一个 iphone 应用程序,它可以为我计算并显示我得到的不同值。我一直认为该应用程序是正确的,但也许我错了。该应用程序的计算方式与我在这里所做的相同,但它不包括出现在 sql 查询中的第一条记录中的升。我的有。
  • 那你需要自己检查一段时间,我们没有足够的数据来帮助这种情况。
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
相关资源
最近更新 更多