【问题标题】:Issue with mathematical calculation inside SQL QuerySQL Query 中的数学计算问题
【发布时间】:2016-10-17 10:34:19
【问题描述】:

group by 查询的列记录总数存在问题。我的数据应该显示如下:

Call Status               Call Results  Percentage
Answering Machine         1             5.6%
DO NOT CALL               9             50.0%
Good Transfer             4             22.2%
Looking for Information   4             22.2%
(blank)                                 0.0%
Total Calls               18    

我正在使用以下查询来完成我的工作。但是我正在使用硬核“18”,因为这里出现的问题是我如何通过 group by 获取整列计数。

$result = mysqli_query($link, "SELECT vs.status_name,vl.call_date,SUM(vl.called_count) as Total,SUM(vl.called_count)/18*100 as percentage from vl_users vu,".$vicidial_log_table." vl,vicidial_list vi,vicidial_statuses vs where vl.call_date >= '2014-01-17 00:00:00' and vl.call_date <= '2016-10-17 23:59:59' group by vs.status_name limit 100000") or die(mysqli_error($link));

上面的数字18是调用结果列的总和。

【问题讨论】:

  • 这是 MySQL 还是 SQL Server?请更加小心您的标签。
  • mysqli_query - MySQL
  • 这是Mysql。我已经删除了 sql server 标签。
  • 但实际上@DavidG 我在表中没有任何空值。

标签: php mysql sql


【解决方案1】:

解决此问题的正确 3 种方法。

  1. 我会先进行总和查询,然后将总和添加到百分比计算中。

  2. 可能需要更长的时间来计算 - 代替 18 做一个子查询来返回总和。

  3. 不要使用mysql来计算百分比。而是使用 php 对数组求和,然后在显示时计算每行的百分比。

1 - 是我的建议。

编辑 好的,鉴于查询的复杂性,答案似乎是 3。 那么该怎么做呢。

$result = mysqli_query($link, "SELECT vs.status_name,vl.call_date,SUM(vl.called_count) as Total from vl_users vu,".$vicidial_log_table." vl,vicidial_list vi,vicidial_statuses vs where vl.call_date >= '2014-01-17 00:00:00' and vl.call_date <= '2016-10-17 23:59:59' group by vs.status_name limit 100000") or die(mysqli_error($link));

$all_results = mysqli_fetch_all($result);

//might be a quicker way but
$sum = 0;
foreach($all_results as $s) {
    $sum  = $sum + $s['Total'];
}


//now to print
echo '<table><tr> <td>Call Status</td><td>Call Results</td><td>Percentage</td></tr>';

foreach($all_results as $row) {

   echo '<tr>';
echo '<td>'.$row['status_name'].'</td>';
echo '<td>'.$row['Total'].'</td>';

$percentage = 0;
if($sum > 0 && $row['Total'] > 0){
   $percentage = ($row['Total']/$sum)*100;
}
echo '<td>'.$percentage.'%</td>';


   echo '</tr>';




}

echo '</table>';

我只是补充一点,我会这样做,看起来还可以。我想测试一下。

【讨论】:

  • 为什么?先计算行的总和,然后将其插入。为什么它不起作用?
  • 我如何在同一个查询中访问列总和的总和。会报错。
  • @junkk rr:就像这样:select a, sum(b), (select sum(b) from t) as total from t group by a.
  • 这 3 种解决方案都是正确的,我也会选择 1。只需抛出 Thorsten 链接的第一个查询。将结果存储在 PHP 变量中。然后,当您准备第二个查询(您的初始查询)时,只需使用该变量更改 18。容易。
  • 为什么大家都喜欢方案一? MySQL 的优化器是否应该如此糟糕以至于它会多次运行这个不相关的子查询?这很难想象。
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多