2016-02-22 71 views
1

我目前正在嘗試使用Google表來根據從我的MYSQL數據庫中提取的信息生成報告。MD數組:如果未找到值,添加額外的數組

的問題是有5個值:['Call Disposition', 'Answered', 'Busy', 'No Answer','Failed']

但問題是從數據庫被拉扯的數據是相當多的事情有3個出了4個值將定義我的谷歌圖表標題中,原因是,如果「失敗」被發現,只有一個值有它,我得到以下錯誤,從谷歌圖表:Uncaught Error: Row 0 has 4 columns, but must have 5

只是爲了在DB一些清晰度,值被自動插入基礎上發生了什麼的呼叫,而不是所有的呼叫都會失敗。

只有少數實例的值會失敗,所以我試圖開發一種方法,如果找不到某個特定的數字,則添加額外的數組。

例如,這是它看起來多麼目前基於什麼我拉出DB和推到MD陣列:

[ [ 'ANSWERED', '477', 728 ], 
    [ 'BUSY', '477', 48 ], 
    [ 'NO ANSWER', '477', 277 ], 
    [ 'ANSWERED', '488', 953 ], 
    [ 'BUSY', '488', 9 ], 
    [ 'FAILED', '488', 1 ], 
    [ 'NO ANSWER', '488', 126 ] ] 

所以,如果說有一個號碼的排列不具有失敗配置添加,但其值設置爲0,因此未找到每個號碼每次都一樣:

[ [ 'ANSWERED', '477', 728 ], 
    [ 'BUSY', '477', 48 ], 
    [ 'FAILED', '477', 0 ], 
    [ 'NO ANSWER', '477', 277 ], 
    [ 'ANSWERED', '488', 953 ], 
    [ 'BUSY', '488', 9 ], 
    [ 'FAILED', '488', 1 ], 
    [ 'NO ANSWER', '488', 126 ] ] 

我現在的代碼如下:

function SQLReportAgentCalls() { 
    valueArr = []; 
    connection2.query({ 
     sql : 'select disposition, src, COUNT(*) from cdr WHERE src="477" or src="488" GROUP BY src, disposition', 
     timeout : 40000 
    }, function (error, results, rows, fields) { 
     console.log("-----------REPORTS------------------------"); 
     for(i in results){ 
       var dipo = results[i]['disposition']; 
       var src = results[i]['src']; 
       var count = results[i]['COUNT(*)']; 

       if(dipo === "FAILED" && count){ 
       var chanar = new Array(dipo,src,count); 
       valueArr.push(chanar); 
       } 

       else if(src && count === null && dipo !== "FAILED"){ 
       var chanar = new Array("FAILED",src,0); 
       valueArr.push(chanar); 
       } 

       else{ 
       var chanar = new Array(dipo,src,count); 
       valueArr.push(chanar); 
       } 
     } 
     console.log(valueArr); 
     console.log("---------------------------------------------------"); 
     SQLReport(); 
    }); 
    } 

客戶端代碼生成報告:

//This generates the report(Google Chart) based on the information that has been pulled from the CDR table server side. 
    socket.on("SQL", function (valueArr) { 
     google.charts.load('current', { 
      packages : ['corechart'] 
     }); 
     google.charts.setOnLoadCallback(drawMaterial); 
     var data = valueArr; 
     function x(data) { 
      var r = [], 
      temp; 
      valueArr.forEach(function (a, i) { 
       if (!(i % 3)) { 
        temp = [a[1]]; 
        r.push(temp); 
       } 
       temp.push(a[2]); 
      }); 
      return r; 
     } 
     function drawMaterial() { 

      result = [['Call Disposition', 'Answered', 'Busy', 'No Answer', 'Failed']].concat(x(valueArr)); 
      console.log(result); 
      var options = { 
       title : 'Call Disposition', 
       hAxis : { 
        title : 'Agents', 
        minValue : 0, 
       }, 
       vAxis : { 
        title : 'Disposition Number' 
       }, 
       isStacked : true 
      }; 
      var chartdata = new google.visualization.arrayToDataTable(result); 
      var material = new google.visualization.ColumnChart(document.getElementById('chart')); 
      material.draw(chartdata, options); 
     } 
    }); 

這可能嗎?我不確定Google Charts是否提供了在不存在的情況下自動添加值的選項,因此這似乎是我能想到解決問題的唯一方法。

+1

爲了獲得更好的性能,變更src =「477」或src =「488」to:src in(「477」,「488」) – sagi

+0

@sagi謝謝你的提示我會這樣做。 – Studento919

回答

0

如果陣列需要像這樣...

['Call Disposition', 'Answered', 'Busy', 'No Answer','Failed']

它可能會更容易在SQL更改爲這樣的事情...

select 
    a.src, 
    (select count(*) from cdr where src = a.src and disposition = 'ANSWERED'), 
    (select count(*) from cdr where src = a.src and disposition = 'BUSY'), 
    (select count(*) from cdr where src = a.src and disposition = 'NO ANSWER'), 
    (select count(*) from cdr where src = a.src and disposition = 'FAILED') 
from 
    cdr a 
where 
    a.src in ("477", "488") 
group by 
    a.src 
+0

該數組已經類似於SQL查詢不是問題的時候,然後將它粘貼到數組中,失敗不會出現在所有src數字中,我已經添加了客戶端代碼以提高清晰度。這些值是硬編碼的,因爲它們不會改變。 – Studento919

+0

我建議更改SQL以消除在客戶端上操作數據的需要 - 我提供的SQL將在'FAILED'列中包含零,如果它不存在... – WhiteHat

+0

是否還有更多由於與之前使用的記錄數量相比,它對我來說似乎非常緩慢 – Studento919