如何计算行和列中值的总和?

时间:2014-09-15 04:50:46

标签: php mysql yii

我有一个值表,其中填充了一系列月份名称和总和。如何计算行和列中这些值的总和,并在结果列中的结果字符串中显示结果?table

public function getReport($year=false)
    {           
        if (!empty($_GET['year'])) $year = (int)$_GET['year'];
        else $year = date ('Y');           

        $from_date = $year.'-01-01 00:00:00';
        $to_date = $year.'-12-31 00:00:00';

        // собираем гигантский запрос
        $fields = 'all_months.fio, all_months.active_count AS sum_active_count, all_months.active_sum AS sum_active_sum';
        $joins = "";

        $months = array('jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'decem');
        $months_ru = array('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');

        // результирующий запрос
        $data = array();
        // блок итого
        $data['result'] = array();

        // ставим ограничение по месяцу, если год текущий

        if ($year == (int)date('Y')) $max_month = date('m')-1;
        else $max_month = 11;

        foreach ($months as $key => $m)
        {
            if ($key > $max_month) break;

            // заголовки колонок запроса
            $data['months'][] = $m;
            $data['months_ru'][] = $months_ru[$key];

            $k = sprintf('%02.0d', ($key + 1));
            $fields .= ', '."\n".$m.'.active_count as '.$m.'_active_count, '.$m.'.active_sum as '.$m.'_active_sum,
                          '."\n".$m.'.realized_count as '.$m.'_realized_count, '.$m.'.realized_sum as '.$m.'_realized_sum';
            $joins .=  "\n"."LEFT JOIN tbl_report ".$m." ON ".$m.".date > '".$year."-".$k."-01 00:00:00' AND 
                ".$m.".date < '".$year."-".$k."-31 24:59:59' AND 
                ".$m.".fio = all_months.fio ";
        }

        // поулчаем данные запроса
        $query = "SELECT DISTINCT ".$fields."
                  FROM tbl_report all_months
                  ".$joins."
                  WHERE all_months.date > '$from_date' AND all_months.date < '$to_date' GROUP BY fio";
    //echo '<!--'.$query.'-->';

        //$db_data = Report::model()->findAllBySql($query);
        $db_data = Yii::app()->db->createCommand($query)->queryAll();

        foreach ($db_data as $row)
        {
            $data['rows'][] = $row;
        }

        // Собираем отчет по суммам по месяцам
        $fields = ' SUM(all_months.active_count) as all_active_count, SUM(all_months.active_sum) as all_active_sum,
                    SUM(all_months.realized_count) as all_realized_count, SUM(all_months.realized_sum) as all_realized_sum ';


        $joins = '';
        foreach ($months as $key => $m)
        {
            if ($key > $max_month) break;

            $k = sprintf('%02.0d', ($key + 1));
            $fields .= ', '."\n SUM(".$m.'.active_count) as '.$m.'_active_count, SUM('.$m.'.active_sum) as '.$m.'_active_sum,
                          '."\n SUM(".$m.'.realized_count) as '.$m.'_realized_count, SUM('.$m.'.realized_sum) as '.$m.'_realized_sum';
            $joins .=  "\n"."LEFT JOIN tbl_report ".$m." ON ".$m.".date > '".$year."-".$k."-01 00:00:00' AND 
                ".$m.".date < '".$year."-".$k."-31 24:59:59' AND 
                ".$m.".fio = all_months.fio ";
        }

        $query = "SELECT DISTINCT ".$fields."
                  FROM tbl_report all_months
                  ".$joins."
                  WHERE all_months.date > '".$year."-01-01 00:00:00' AND all_months.date < '".$year."-12-31 24:59:59'";
        //echo $query;
        $data['summary'] = Yii::app()->db->createCommand($query)->queryRow();

        // форматируем числа
        if (!empty($data['rows']) && is_array($data['rows']))
        foreach ($data['rows'] as &$row)
            if (!empty($data['months']) && is_array($data['months']))
            foreach ($data['months'] as $month)
            {
                $row[$month.'_active_count'] = (int)$row[$month.'_active_count'];
                $row[$month.'_active_sum'] = FormatHelper::MF($row[$month.'_active_sum']);
                $row[$month.'_realized_count'] = (int) $row[$month.'_realized_count'];
                $row[$month.'_realized_sum'] = FormatHelper::MF($row[$month.'_realized_sum']);
            }

        // форматируем результирующие строки
        if (!empty($data['months']) && is_array($data['months']))
        foreach ($data['months'] as $month)
            {
                $data['summary'][$month.'_active_count'] = (int)$data['summary'][$month.'_active_count'];
                $data['summary'][$month.'_active_sum'] = FormatHelper::MF($data['summary'][$month.'_active_sum']);
                $data['summary'][$month.'_realized_count'] = (int) $data['summary'][$month.'_realized_count'];
                $data['summary'][$month.'_realized_sum'] = FormatHelper::MF($data['summary'][$month.'_realized_sum']);
            }

        // разворачиваем порядок месяцев в обратном направлении
        //$data['months'] = array_reverse($data['months']);
        //$data['months_ru'] = array_reverse($data['months_ru']);
        //print_r( $months_ru );
        return $data;
    }

1 个答案:

答案 0 :(得分:2)

点击此链接:: Here

这段代码转到你的视图文件

'columns'=>array(
                ..........
                array(
                        'name'=>'age',
                        'footer'=>'Total: ' . $model->getTotal($model->search()->getData(), 'age'),
                ),
                array(
                        'name'=>'weight',
                        'footer'=>'Total: ' . $model->getTotal($model->search()->getData(), 'weight'),
                ),
                ..........
        ),

,这个转到您的模型文件

 public function getTotal($records, $column)
        {
                $total = 0;
                foreach ($records as $record) {
                        $total += $record->$column;
                }
                return $total;
        }