Создать отчет для нескольких мест - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь получить следующий результат в CodeIgniter

SELECT location, COUNT(location), AVG(review) FROM progrodb.tickets WHERE datesubmitted BETWEEN '2018-9-1' AND '2018-9-30' AND location = 'location'

Выходные данные должны быть:

Location|Total Tickets|Avg Review<br>
location|3            |4.5

Эта таблица должна содержать результат для каждого местоположения.Оператор SQL as предоставляет результаты для одного местоположения, теперь мне нужно, чтобы это было сделано в общей сложности для 22 местоположений.

Я попытался выполнить следующую попытку, но после того, как результаты var_dump () вернули null

public function generatereport(){
        // Set Page Title
        $this->data['page_title'] = 'Generate Report';

        $rules = $this->support_m->rules_report;
        $this->form_validation->set_rules($rules);

        $startdate = $this->input->post('startdate');
        $enddate = $this->input->post('enddate');
        define('locations', array('Shoppers Fair Blue Diamond', 'Shoppers Fair Burke Road', 'Shoppers Fair Brunswick', 'Shoppers Fair Duhaney Park', 'Shoppers Fair Greater Portmore', 'Shoppers Fair View', 'Shoppers Fair Junction', 'Shoppers Fair Liguanea', 'Shoppers Fair Manchester'));

         if ($this->form_validation->run() == TRUE){
            $results = $this->db->select('location, count(location) as location_count, AVG(review) as review_avg')
            ->where('datesubmitted BETWEEN "'.$startdate.'" AND "'.$enddate.'"')
            ->group_by('location') 
            ->get('tickets')->result();
            var_dump($results);

         }

        // Load view    
        $this->data['subview'] = 'admin/tickets/report';
        $this->load->view( 'admin/body', $this->data );

    }

И получил следующий дамп, теперь я пытаюсь передать результаты в представление, но получаю ошибки Неопределенная переменная: отчеты и Попытка получить свойство необъекта.

enter image description here

enter image description here

Ответы [ 5 ]

0 голосов
/ 24 сентября 2018

Код ниже работал как задумано:

В контроллере

public function generatereport(){
        // Set Page Title
        $this->data['page_title'] = 'Generate Report';
        $this->data['reports'] = null;

        $rules = $this->support_m->rules_report;
        $this->form_validation->set_rules($rules);

        $startdate = $this->input->post('startdate');
        $enddate = $this->input->post('enddate');

        if ($this->form_validation->run() == TRUE){
            $results = $this->db->select('location, count(location) as locationcount, AVG(review) as reviewavg')
            ->where('datesubmitted BETWEEN "'.$startdate.'" AND "'.$enddate.'"')
            ->group_by('location') 
            ->get('tickets')->result();
            $this->data['reports'] = $results;
        }

        // Load view    
        $this->data['subview'] = 'admin/tickets/report';
        $this->load->view( 'admin/body', $this->data );

    }

В представлении

<table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Location</th>
                            <th>Total Tickets</th>
                            <th>Avg Review</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php 
                            if(count($reports)): foreach($reports as $ticketreport): 
                        ?>
                        <tr>
                            <td><?php echo $ticketreport->location; ?></td>
                            <td><?php echo $ticketreport->locationcount; ?></td>
                            <td><?php echo $ticketreport->reviewavg; ?></td>
                        </tr>
                        <?php endforeach; ?>
                        <?php else: ?>
                            <tr>
                                <td colspan="4">We could not find any records.</td>
                            </tr>
                            <?php endif; ?> 
                    </tbody>
                </table>

Спасибо всем, ктовклад.

0 голосов
/ 24 сентября 2018

Я думаю, что вам нужно предложение HAVING для агрегатных функций.Примерно так может работать:

SELECT
    location,
    COUNT( location ),
    AVG( review ) 
FROM
    progrodb.tickets 
WHERE
    datesubmitted BETWEEN '2018-9-1' 
    AND '2018-9-30' 
HAVING
    location = 'location'
0 голосов
/ 21 сентября 2018

Для создания отчета по нескольким местоположениям вы можете использовать следующее:

   $results = $this->db->select('count(location), AVG(review)')
   ->where('datesubmitted BETWEEN "2018-9-1" AND "2018-9-30"')
   ->group_by('location') 
   ->get('tickets')->result();
0 голосов
/ 21 сентября 2018

Если я понял, что вы хотите, может помочь что-то вроде этого:

SELECT location, COUNT(location) as location_count, AVG(review) as review_avg
FROM progrodb.tickets
WHERE datesubmitted BETWEEN '2018-09-01' AND '2018-09-30'
GROUP BY location

Я присвоил счет и среднее значение для читабельности

0 голосов
/ 21 сентября 2018

Я думаю, тебе нужно что-то подобное

SELECT location, COUNT(location), AVG(review) 
FROM progrodb.tickets
WHERE datesubmitted BETWEEN '2018-9-1' AND '2018-9-30'
GROUP BY location = 'location'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...