2016-08-30 27 views
1

我有以下表格。生成按日期和部門分組的報告mysql

---+---------------+-------------+--------+ 
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來生成從迄今爲止的數組。然後試圖運行GROUP BY使用下面的CakePHP查詢各創建日期:

//$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

@Strawberry我無法理解他的回答。其實我沒有在其中找到GROUP_BY。你能否詳細說明一下。 –

+0

它不需要GROUP BY子句,因爲它只包含聚合列。相比之下,你的確需要一個GROUP BY子句,但我相信你可以弄清楚。 – Strawberry

+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; 
+0

如果department_id列包含數千個部門ID,該怎麼辦?你不能只假設三個部門。 –

+0

@KuldeepChoudhary您可以構建一個sproc來處理這樣的場景 - 但我不會。通常最好處理應用程序級代碼中的數據顯示問題 - 在這種情況下,這是一個簡單的php循環,例如,根據一個有序的數組進行操作。 – Strawberry

0

兩列單羣部門標識和創造的 - 和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); 

現在你可以在列和部門,行標題日期此報告。希望這個幫助,它不被遵守,可能包含一些錯誤,但邏輯將運作良好。

+0

根據你的回答報告是不是看起來像我需要什麼。 –