Разделение массива результатов MySQL для вывода суммы и заголовка категории - PullRequest
1 голос
/ 04 января 2012

У меня есть таблица инвентаризации в моей базе данных MySQL как часть приложения, которое я использую для отслеживания предметов, которые хранит моя компания.

В настоящее время я работаю над окончанием приложения для выставления счетов, в котором я разрешаю экспортировать отчет Excel через PHPExcel.Элементы в таблице «items» имеют идентификатор компании и идентификатор категории.Категории являются детьми компаний для организации.

Для экспорта в Excel я буду работать только с одной компанией за раз, поэтому мой SQL-запрос соединяет мою таблицу элементов с моей таблицей категорий, поэтому у меня есть имена для работы.

У меня все это отлично работает, но я пытаюсь сохранить промежуточные суммы ежемесячных сборов по категориям и сохранить название для каждого раздела.Поэтому я хочу, чтобы экспортированные данные базы данных были разбиты на куски по категориям.

Мой текущий оператор SQL в моей модели Codeigniter:

    function get_inventory_fees($where = array())
    {
        // Function that returns object of items table with area calculation and charge calculations grouped by items
        $this->db->select('i.bbn bbn, i.name item_name, c.name cat_name, i.date_recd date_received, SUM(i.length * i.width * i.height * i.qty) area, i.location location, r.rate, SUM(i.length * i.width * i.height * i.qty * r.rate) fee');
        $this->db->join('rates r', 'r.name = i.location');
        $this->db->join('categories c', 'c.id = i.cat');
        $this->db->where('shipped IS NULL', null, false);
        $this->db->group_by('i.id');
        $this->db->order_by('cat_name asc, location asc');
        $query = $this->db->get_where('items i', $where);
        return $query;
    }

Мой код цикла:

    $category_total = 0;
    $category_name = '';
    foreach($this->inventory->result() as $data)
    {
        if($data->cat_name != $category_name)
        {               
            if($category_total > 0)
            {
                $row++;
                $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(6, $row, 'Total:');
                $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(7, $row, $category_total);
                $row++;
                $category_total=0;
            }
            $row++;
            $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $row, $data->cat_name);
            $category_name = $data->cat_name;
            $row++;
        }
        $col = 0;
        foreach ($fields as $field)
        {
            $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $data->$field);
            $col++;
        }
        $category_total+=$data->fee;

        $row++;
    }

Я стараюсь избегать вложенных запросов, так как я делал это в моей предыдущей версии приложения.Это будет ужасно медленно, но это сработало.На этот раз я переделываю вещи с Codeigniter и, надеюсь, немного больше опыта.

Однако моя проблема с моим текущим кодом заключается в том, что я не получаю итоговую сумму в моей последней категории, поскольку следующей категории нетсравнить это с.К сожалению, мне не хватает кофеина, чтобы понять это отсюда.Есть идеи или лучшие решения?

1 Ответ

0 голосов
/ 04 января 2012

Я не работал с воспламенителем кода, поэтому я просто укажу на возможное решение, которое я использую в некоторых случаях, но вам придется найти способ его интеграции.

Возможно, вы могли бы использовать WITH ROLLUP вваша группаWITH ROLLUP добавляет NULL LINES и сумму для каждой группы, так что вы можете быть заинтересованы этим решением, но я не совсем уверен.

http://dev.mysql.com/doc/refman/5.0/fr/group-by-modifiers.html

Example|data
------------
1      |1
2      |1
3      |2
4      |2
5      |2

SELECT SUM(example) as sum_example, data FROM mydata GROUP BY data WITH ROLLUP

sum_example|data
----------------
3          |1
12         |2
15         |NULL

Удачи

...