Javascript MD数组:如果值为',则添加其他数组;找不到
我目前正在尝试使用Google tables生成一个基于我从MYSQL数据库中获取的信息的报告 问题是有5个标题值:Javascript MD数组:如果值为',则添加其他数组;找不到,javascript,mysql,arrays,google-visualization,Javascript,Mysql,Arrays,Google Visualization,我目前正在尝试使用Google tables生成一个基于我从MYSQL数据库中获取的信息的报告 问题是有5个标题值:[‘呼叫处理’、‘应答’、‘忙’、‘无应答’、‘失败’] 但问题是,从数据库中提取的数据几乎会有4个值中的3个,这将定义我的Google图表标题,原因是如果找到“Failed”并且只有一个值,我从Google图表中得到以下错误:Uncaught error:第0行有4列,但必须有5列 为了让数据库更清晰,这些值是根据调用发生的情况自动插入的,并非所有调用都会失败 只有少数实例的值会
[‘呼叫处理’、‘应答’、‘忙’、‘无应答’、‘失败’]
但问题是,从数据库中提取的数据几乎会有4个值中的3个,这将定义我的Google图表标题,原因是如果找到“Failed”并且只有一个值,我从Google图表中得到以下错误:Uncaught error:第0行有4列,但必须有5列
为了让数据库更清晰,这些值是根据调用发生的情况自动插入的,并非所有调用都会失败
只有少数实例的值会失败,因此我尝试开发一种方法,如果找不到特定数字的值,则添加该额外数组
例如,根据am从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是否提供了在不存在值时自动添加值的选项,因此这似乎是我能想到的解决问题的唯一方法。如果阵列需要类似于此
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
[‘呼叫处理’、‘已应答’、‘忙’、‘无应答’、‘失败’]
将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
如果数组需要类似于此
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
[‘呼叫处理’、‘已应答’、‘忙’、‘无应答’、‘失败’]
将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
为了获得更好的性能,请将src=“477”或src=“488”更改为:src in(“477”、“488”)@sagi感谢您的提示,我会这样做。为了获得更好的性能,请将src=“477”或src=“488”更改为:src in(“477”、“488”)@sagi谢谢你的提示,我会这么做的。这个数组已经类似于SQL查询不是问题了,当我将它粘贴到一个数组中时,失败不会出现在所有的src编号中,为了清晰起见,我添加了客户端代码。这些值是硬编码的,因为它们不会更改。我建议更改SQL以消除在客户端上操作数据的需要——我提供的SQL如果不存在,将在“FAILED”列中包含一个零……有没有更有效的方法?与我以前相比,由于记录的数量太多,对我来说似乎速度太慢了使用beforethearray已经类似于SQL查询不是问题所在,当我将其粘贴到数组中时,failed不会出现在所有src编号中,为了清晰起见,我添加了客户端代码。这些值是硬编码的,因为它们不会更改。我建议更改SQL以消除在客户端上操作数据的需要——我提供的SQL如果不存在,将在“FAILED”列中包含一个零……有没有更有效的方法?与我以前相比,由于记录的数量太多,对我来说似乎速度太慢了使用前