SQL Query中的数学计算问题

时间:2016-10-17 10:34:19

标签: php mysql sql

按查询分组列记录总数存在问题。我的数据应该显示为:

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是调用结果列的总和。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

解决这个问题的正确方法。

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

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

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

  4. 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>';
    

    我只是补充一点,我就是这样做的,似乎没问题。我想测试一下。