PHP: помогите с этой логикой - PullRequest
0 голосов
/ 16 ноября 2010

У меня проблема.У меня есть таблица поддержки билетов (wh_task).Каждая задача имеет поле date_completed (d / m / Y) и has_met_sla (0 или -1).Я хочу, чтобы пользователь мог искать в этой таблице по date_completed и отображать диаграмму на основе результатов.

Данные диаграмм должны выглядеть следующим образом, чтобы можно было заполнить диаграмму (диаграммы слияния):

Год: 2010 |Месяц: ноябрь |SLA Met: 12 |SLA Пропущено: 2

Год: 2010 |Месяц: октябрь |SLA Met: 15 |SLA пропущено: 1

На диаграмме будут цифры вверх по оси x и «ноябрь 2010» вдоль оси 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, и, если нет, добавьте ее в массив ??

Спасибо всем!

Джонси

Ответы [ 2 ]

3 голосов
/ 16 ноября 2010

Я думаю, вам лучше выполнять такую ​​обработку в 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 голос
/ 16 ноября 2010

Вот что я бы сделал, если бы мне пришлось делать это на 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";
    }
}
...