2010-11-16 144 views
0

我有一个问题。我有一张支持票(wh_task)。每个任务都有一个date_completed(d/m/Y)和has_met_sla字段(0或-1)。我希望允许用户通过date_completed搜索此表,并根据结果显示图表。PHP:帮助这个逻辑

的图表数据必须是这样的,所以我可以填充条形图(融合图表):

年份:2010 |月:11月| SLA会见:12 | SLA错过:2

年代2010 |月:10月| SLA遇见:15 | SLA错过了:1

该图表中的数字会沿y轴向x轴和“Nov 2010”。沿着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

我也正在采取必要的SQL注入预处理.... – iamjonesy 2010-11-16 13:20:29

+0

不,你不是。您不参数化您的查询。在这种特殊情况下,您可以明确地将$ atid转换为整数,但参数化查询是一个更好的解决方案 - 它们适用于任何数据类型,几乎适用于所有情况。 – tdammers 2010-11-16 13:25:49

+0

不,我只是没有把它包含在我的代码snippit中,但我首先检查数据并将不需要的东西删除。 – iamjonesy 2010-11-16 13:33:48

回答

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"; 
    } 
} 
+0

这是个好东东,非常感谢!工作过一种享受! – iamjonesy 2010-11-16 14:04:53

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 

的所有你需要做的是从数据库中获取的数据,将其显示在表格中。