php - SQL 到 CSV 在 php 脚本中,组的多个 'total' 行

标签 php mysql csv

我有一个运行 MySQL 查询并将结果写入 CSV 的 php 脚本,该脚本运行成功,但我也希望我的 csv 为每个“组”代理提供一行,以汇总他们的数量。

当前输出如下所示:

enter image description here

所以你可以看到它们是按扩展名排序的。所以我希望我的输出,例如 7200,是:

7200 totals: 1 | 0 | 1 | 0 | 2

基本上只是添加一行来汇总每个分机的 x 计数,这意味着我将有大约 13 行,因为我在完整报告中有 13 个代理分机。

我不确定我是否可以通过某种方式使用 SQL、写入 CSV 或仅在 PHP 中执行此操作。以最好和更合理的为准。

这是用于查询的 PHP 变量:

$result = mysqli_query($conn2,
"SELECT  firstn
, lastn
, extension
, Recieved
, RecievedKnown
, Outbound
, outboundKnown
, Missed
, MissedKnown
, CallingNumber
, CalledNumber
, starttime
, endtime
  , duration
, HOLDTIMESECS
, TERMINATIONREASONCODE

    FROM (
  SELECT firstn
   , lastn
   , c.extension
   ,CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 'x' ELSE '' END AS Recieved
   , case when LEGTYPE1 = 2 and answered = 1 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as RecievedKnown
   , CASE WHEN ANSWERED = 1 AND LEGTYPE1 = 1 then 'x' ELSE '' end  AS Outbound
   , case when LEGTYPE1 = 1 and FINALLYCALLEDPARTYNO = k.phone_number then 'x' ELSE '' end as outboundKnown
   , case when Answered = 0 then 'x' ELSE '' end as Missed
   , case when ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as MissedKnown
   , a.CALLINGPARTYNO AS CallingNumber
   , a.FINALLYCALLEDPARTYNO AS CalledNumber
   , b.starttime as starttime
   , b.endtime as endtime
   , b.duration
   , a.holdtimesecs
   , a.terminationreasoncode

  FROM test.session a
  INNER JOIN test.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID
  right join test2.users c on a.callingpartyno = c.extension or a.finallycalledpartyno = c.extension
  LEFT JOIN test.known_numbers k ON a.callingpartyno = k.phone_number
  WHERE a.ts >= curdate()
  and(a.CALLINGPARTYNO in (select extension from test.ambition_users) OR a.finallycalledpartyno IN (select extension from test.ambition_users))


 ) x
 ORDER BY extension;") or die(mysqli_error( $conn2));




if (!$result) die('Couldn\'t fetch records');
$num_fields = mysqli_num_fields($result);
$headers = array();
while ($fieldinfo = mysqli_fetch_field($result)) {
    $headers[] = $fieldinfo->name;
}
$fp = fopen('test.csv', 'w');
if ($fp && $result) {
 fputcsv($fp, $headers);
 while ($row = $result->fetch_array(MYSQLI_NUM)) {
    fputcsv($fp, array_values($row));
}
    fclose($fp);
}


$file = "test.csv";

最佳答案

可能最容易在获取行时跟踪 PHP 中的总计,并在每次“扩展”列更改值时输出“总计”行(第一个扩展组之前除外)。

$extension = null;
$totals = array_fill_keys($headers, 0);
$summableColumns = ['Received', 'ReceivedKnown', 'Outbound', 'outboundKnown', 'Missed', 'missedKnown'];
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
    if ($row['extension'] != $extension && $extension != null) {
        $totals['extension'] = "$extension totals:";
        fputcsv($fp, $totals);
        $totals = array_fill_keys($headers, 0);
        $extension = $row['extension'];
    }
    foreach ($summableColumns as $col) {
        if ($row[$col] == 'x') {
            $totals[$col]++;
        }
    }
    fputcsv($fp, array_values($row));
}

以上代码未经测试,但应该能说明思路。

请注意,我将提取更改为使用 MYSQLI_ASSOC

还要注意匹配 MySQL 结果集中列标题的大小写,因为 PHP 关联数组区分大小写。

关于php - SQL 到 CSV 在 php 脚本中,组的多个 'total' 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47514617/

相关文章:

php - 在数组php中随机播放

php - 如何在数据库(MySQL)中存储多语言数据?

mysql - 在 Laravel 中需要关系数据

ios - 将 CSV 文件保存到文档目录文件夹

python - Pandas 用毫秒解析三个字段的日期

php - 在 php 中创建图像仅在页面上没有其他任何事情发生时才有效

php - 按多列对多维数组进行排序

mysql - 如何对临时表使用 IN 运算符

php - 通过 concat 但以相反的顺序向数据库添加值(最后一行将在第一行)

csv - 经典 ASP - 如何使用 UTF-8 将数据保存到 CSV 文件