我有下表。
---+---------------+-------------+--------+
id | department_id | created | amount |
---+---------------+-------------+--------+
1 | 0 | 2016-05-05 | 500 |
2 | 2 | 2016-05-05 | 100 |
3 | 1 | 2016-05-05 | 160 |
4 | 2 | 2016-05-05 | 260 |
5 | 1 | 2016-05-04 | 100 |
6 | 0 | 2016-05-04 | 150 |
7 | 1 | 2016-05-04 | 160 |
8 | 2 | 2016-05-04 | 160 |
---+---------------+-------------+--------+
我想生成报告,以显示特定日期特定部门的收集情况。需要显示如下表:
Date | 0 | 1 | 2 |
2016-05-05 | 500 | 160 | 360 |
2016-05-04 | 150 | 260 | 160 |
我正在使用cakephp。如果我使用GROUP BY创建它可以工作,如果我使用GROUP BY department_id它工作。但是我需要GROUP BY来生成所需的报告。
我还尝试使用this生成来自日期的数组。然后尝试使用以下CakePHP查询运行在每个日期创建的GROUP BY:
//$ar = date array
foreach ($ar as $k) {
$this->Transaction->find('all',array('conditions'=>array('Transaction.created'=>$k),'fields'=>array('SUM(Transaction.amount) AS s','Transaction.department_id'),'group'=>array('Transaction.department_id')));
}
但如果日期范围很长,对我来说似乎是缓慢的解决方案。有没有最好的方法在单个查询中完成。
请帮我解决这个问题。
答案 0 :(得分:0)
这个问题的变化被无休止地询问和回答。一个典型的解决方案是这样的......
SELECT created date
, SUM(CASE WHEN department_id = 0 THEN amount END) dept0
, SUM(CASE WHEN department_id = 1 THEN amount END) dept1
, SUM(CASE WHEN department_id = 2 THEN amount END) dept2
FROM my_table
GROUP
BY date;
答案 1 :(得分:0)
简单分组由两列department_id创建 - 和sum(金额)函数来计算每个组的总数。
$report_rows = $this->{{Model_NAME}}->find('all', array(
'fields' => array('department_id', 'created', 'sum(amount)'),
'group' => 'department_id, created'
));
然后您可以在视图上显示此报告
$dates = Set::extract('/{{Model_NAME}}/created', $report_rows);
$departments = Set::extract('/{{Model_NAME}}/department_id', $report_rows);
现在,您可以将列和部门中的日期作为行标题。希望这个帮助,它没有被遵守,可能包含一些错误,但逻辑将运作良好。