我有一个运行 MySQL 查询并将结果写入 CSV 的 php 脚本,该脚本运行成功,但我也希望我的 csv 为每个“组”代理提供一行,以汇总他们的数量。
当前输出如下所示:
所以你可以看到它们是按扩展名排序的。所以我希望我的输出,例如 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/