2016-02-22 48 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