2017-11-27 6 views
1

私はMySQLクエリを実行し、結果をCSVに書き込みますが、正常に動作していますが、CSVにも行その数を合計するエージェントの「グループ」ごとにPHPのスクリプトからSQLへのCSV、グループの複数の「合計」行

電流出力は次のようになります。

enter image description here

だから、彼らはここで拡張されたものです見ることができます。だから私は7200のための私の出力は、たとえば、になりたい:

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

を基本的にはちょうど私が持っているので、私は約13行を持っているでしょう意味し、各拡張のXの数を合計行を追加しますフルレポートの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"; 
+0

「SUM(CASE ...)」を使ってみてください。 「x」と「 '」をそれぞれ「1」と「0」に変更します。 –

+0

いいえ、SQLサーバーではありません。実際にはPHPスクリプトで動作しています –

答えて

1

おそらくあなたが行をフェッチとして、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に変更しました。

PHPの連想配列では大文字と小文字が区別されるため、MySQLの結果セットの列見出しの大文字と小文字を区別してください。