我的MySQL数据库中有一个库存表,作为应用程序的一部分,我用来跟踪我公司存储的项目。
我目前正在处理该应用程序的计费端,允许通过PHPExcel导出Excel报告。"items"表中的项具有公司id和类别id。类别是组织的公司的子级。
对于我的Excel导出,我一次只能与一家公司合作,所以我的SQL查询将我的项目表与类别表连接起来,这样我就有了可以使用的名称。
我所有这些都做得很好,但我正在努力保持每个类别的月费总额,并为每个部分保留一个标题。因此,我希望导出的数据库数据按类别划分为块。
我的Codeigniter模型中的当前SQL语句:
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重新设计东西,希望能有更多的经验。
然而,我对当前代码的问题是,我没有得到上一个类别的总数,因为没有下一个类别可以比较。不幸的是,我的咖啡因不够,无法从这里计算出来。有什么想法或更好的解决方案吗?
我没有使用过代码点火器,所以我只会指出我在某些情况下使用的可能解决方案,但你必须找到一种集成它的方法。
你可以在你的小组中使用WITH ROLLUP。WITH ROLLOP添加NULL行和每个小组的总和,所以你可能会对这个解决方案感到困惑,但我不完全确定。
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
祝好运