生成按天和部门mysql

时间:2016-08-30 15:12:01

标签: php mysql cakephp

我有下表。

---+---------------+-------------+--------+
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')));
    }

但如果日期范围很长,对我来说似乎是缓慢的解决方案。有没有最好的方法在单个查询中完成。

请帮我解决这个问题。

2 个答案:

答案 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);

现在,您可以将列和部门中的日期作为行标题。希望这个帮助,它没有被遵守,可能包含一些错误,但逻辑将运作良好。