mysql — PHP, sql запрос в CSV, форматирование строк для итогов

У меня есть рабочий скрипт, который при выполнении запускает следующий SQL-запрос, который затем записывается в CSV. Все это работает отлично.

Однако я бы хотел немного отформатировать форматирование. В настоящее время он записывает результаты по сотрудникам и заказы прошлой ночью. Я хотел бы, чтобы в конце всех записей агента была строка, в которой было указано что-то вроде «Имя агента: Итоги», а затем подводились итоги их записей.

Например, каждая строка имеет свое имя, добавочный номер телефона, а затем несколько метрик, которые либо являются пустыми, либо имеют символ «x», и, наконец, число, представляющее время на телефоне. Поэтому я хотел бы суммировать x в соответствующих полях, добавить продолжительность времени по телефону и, наконец, общее количество вызовов (которое будет числом записей этого сотрудника).

Я не знаю, должно ли это быть сделано в SQL, в блоке кода CSV или есть лучший способ хранить метрики с помощью PHP и делать это программно.

Я новичок здесь, обычно просто полагаюсь на запросы в MySQL, поэтому любая помощь очень ценится.

Вот сценарий:

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

FROM (
SELECT
u.firstn
, u.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 ambition.session a
INNER JOIN ambition.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID
INNER JOIN ambition.mxuser c ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID
INNER JOIN jackson_id.users u ON c.extension = u.extension
LEFT JOIN ambition.known_numbers k ON a.callingpartyno = k.phone_number
WHERE date(b.ts) >= curdate()
AND LEGTYPE1 <> 12 -- This keeps the report from having blank spaces due to the 12 legtype.
AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)

) x
ORDER BY lastn") or die(mysqli_error( $conn2));$userDetails = array();
while($row = $result->fetch_array(MYSQLI_NUM)){
/* Let me take the extension as the key to store its respective counts */
$extension = $row['extension'];
/* Now in your while loop do all the calculations for the user */
if(!isset($userDetails[$extension])){
/* Since this is the first time for the extension your doin the calculations */
$userDetails[$extension]['missedCallCounts'] = 1; /* First time count */
}else{
$userDetails[$extension]['missedCallCounts'] += 1; /* Sum up the count */
}
}

foreach($userDetails as $userDetail){
/* In the following line dump the respective userdetails to csv which will show summary */
fputcsv($fp, array_values($userDetails));
}

И скриншот текущего CSV приводит к Excel (пропущенные имена / номера, но вы все еще видите идею):
введите описание изображения здесь

Таким образом, для расширения 7312, под первыми двумя строками будет новый ряд с чем-то вроде:

7312's Totals | 0 | 0 | 0 | 0 | 2 | 2 | - | - | - | - | 76 | 0

0

Решение

Ваш цикл в запросе sql для вывода того же файла в CSV-файл, в то же время сохраняйте записи в универсальном массиве и сбрасывайте их после завершения цикла.

Например:

$userDetails = array();
while($row = $result->fetch_array(MYSQLI_NUM)){
/* Let me take the extension as the key to store its respective counts */
$extension = $row['extension'];
/* Now in your while loop do all the calculations for the user */
if(!isset($userDetails[$extension])){
/* Since this is the first time for the extension your doin the calculations */
$userDetails[$extension]['missedCallCounts'] = 1; /* First time count */
}else{
$userDetails[$extension]['missedCallCounts'] += 1; /* Sum up the count */
}
}

Теперь перейдите в $ userDetails и сбросьте то же самое в CSV

foreach($userDetails as $userDetail){
/* In the following line dump the respective userdetails to csv which will show summary */
fputcsv($fp, array_values($userDetails));
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector