我有问题。我有一张支持票据表(wh_task)。每个任务都有一个date_completed(d / m / Y)和has_met_sla字段(0或-1)。我想允许用户通过date_completed搜索此表,并根据结果显示图表。
图表数据必须如下所示,以便我可以填充条形图(融合图表):
年份:2010 |月:11月| SLA遇见:12 | SLA错过了:2
年份:2010 |月:10月| SLA遇见:15 | SLA错过:1
该图表的数字将沿x轴向上,“2010年11月”沿y向上。沿y的每个月都有2列,遇到并没有遇到。
所以,我可以创建这种图表没有问题,但它产生的数据我遇到了麻烦。以下是我的询问:
$tsql = "SELECT task_id, has_met_service_level_agreement, date_completed ".
"FROM wh_task ".
"WHERE (task_status_id = 5) AND (account_id =$atid)";
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false)
{
echo "Error in query preparation/execution.\n";
die( print_r( sqlsrv_errors(), true));
}
//SLA counters
$met = 0;
$missed = 0;
/* Retrieve each row as an associative array and display the results.*/
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
{
$date = $row['date_completed'];
$monthnumber = date_format($date, "n");
$year = date_format($date, "Y");
$hasmetsla = $row['has_met_service_level_agreement'];
}
}
你能帮我解释一下这里的逻辑吗?我猜我需要将数据存储在一个包含月份,年份,总计和未满足总数的数组中。然后为每个任务检查数组中是否已存在年月组合,如果是,则根据$ hasmetsla修改总计,如果不是,则将其添加到数组中?
全部谢谢!
Jonesy
答案 0 :(得分:3)
我认为你最好在SQL中进行这种处理。使用两步解决方案:首先,找到一个查询,为您提供每行的年,月和sla_met。把它放在一个视图中。然后使用group_by,sum()和count()的巧妙组合对该视图进行查询,以计算所需的结果:
CREATE VIEW vw_sla AS SELECT DATEPART(year, date_completed) AS year, DATEPART(month, date_completed), CASE has_met_service_level_agreement WHEN 0 THEN 0 ELSE 1 END as sla_met
SELECT year, month, sum(sla_met), count(*) - sum(sla_met) FROM vw_sla GROUP BY year, month ORDER BY year DESC month DESC
您需要做的就是从数据库中获取数据,并将其显示在表格中。
答案 1 :(得分:1)
如果我必须在PHP中执行此操作,那么我会做什么(使用SQL会是更好的选择,但这是事后执行此操作的一种方法):
首先,我设置了一个具有以下结构的多维数组:
array(
'year1' => array(
'month1' => array(
'met' => 0,
'missed' => 0,
),
),
),
然后,我会更改while
循环以执行以下操作:
$yearInfo = array();
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
$date = $row['date_completed'];
$monthnumber = date_format($date, "n");
$year = date_format($date, "Y");
$hasmetsla = $row['has_met_service_level_agreement'];
if (!isset($yearInfo[$year])) {
$yearInfo[$year] = array(
$monthnumber => array(
'met' => 0,
'missed' => 0
)
);
} elseif (!isset($yearInfo[$year][$monthnumber])) {
$yearInfo[$year][$monthnumber] = array(
'met' => 0,
'missed' => 0,
);
}
$key = $hasmetsla ? 'met' : 'missed';
$yearInfo[$year][$monthnumber][$key]++;
}
然后,当你显示:
$data = '';
foreach ($yearInfo as $year => $months) {
foreach ($months as $month => $status) {
$data .= 'Year: '.$year.' | '.
'Month: '.$month.' | '.
'SLA Met: '.$status['met'].' | '.
'SLA Missed: '.$status['missed']."\n";
}
}