2016-07-25 98 views
0

這是我的mysql收入表。如何按月分組並在某月份沒有值時返回零?

+----+------------------+---------------------------+------------+---------+ 
| id | title   | description    | date  | amount | 
+----+------------------+---------------------------+------------+---------+ 
| 1 | Vehicle sales up | From new sale up   | 2016-09-09 | 9999.99 | 
| 2 | Jem 2 Sales  | From rathnapura store  | 2016-05-15 | 9545.25 | 
| 3 | Jem 2 Sales 2 | From rathnapura store  | 2016-05-15 | 9545.25 | 
| 4 | Jem 2 Sales 2 | From rathnapura store 234 | 2016-05-15 | 9545.25 | 
+----+------------------+---------------------------+------------+---------+ 

字段'date'是標準的sql日期。我執行這個查詢是爲了按月收入的總和,如果沒有從某個月的收入返回零。如果沒有來自某個月的收入,我想要零,因爲我想在圖表中顯示這些數據。

這是查詢。

SELECT MONTHNAME(`date`) AS mName, MONTH(`date`) AS mOrder, ifnull(sum(amount),0) AS total_num FROM income GROUP BY mOrder ORDER BY mOrder DESC 

但我只得到如下輸出。如果在其他月份沒有值,則不能爲零。這是輸出。

+-----------+--------+-----------+ 
| mName  | mOrder | total_num | 
+-----------+--------+-----------+ 
| September |  9 | 9999.99 | 
| May  |  5 | 28635.75 | 
+-----------+--------+-----------+ 

而且我希望上表中的其他月份和total_num爲零。我怎樣才能做到這一點?那裏也有同樣的問題。但沒有工作的答案。 Group by month and return 0 if data not found

請幫我解決這個問題。我使用這個應用程序的語言是Node.js的:)

+0

但是你只有兩個月份你的榜樣,所以結果相當有規律。 – user1016265

+0

我想你會需要一些Calandar表,並加入它,然後按月組 – guiguiblitz

+0

@ user1016265是的,我有幾個月。但我認爲這並不重要。因爲如果代碼是正確的,其他月份應該與zoro一起出現。不是?這就是我想要的原因。想象一下,這是一個會計系統,在年初,我們只有1月份的收入。所以其他11個月的收入必須爲0。不是? –

回答

1

也許這不是最好的辦法,但它會解決你的問題。作爲一個快速指南:

SELECT 'January' AS mName, 1 AS mOrder, COALESCE(SUM(amount),0) AS total_num 
FROM income i 
WHERE month(i.date) = 1 

UNION 

SELECT 'February' AS mName, 2 AS mOrder, COALESCE(SUM(amount),0) AS total_num 
FROM income i 
WHERE month(i.date) = 2 

UNION 

...and go on 
+0

我認爲這個解決方案是可能的,即使它有點醜陋:-) – user1016265

+0

這不會工作,因爲你仍然從收入中選擇 - 也許不是所有的月份都在.. –

+0

沒關係。想象一下你在一月份沒有任何日期。第一個選擇將返回1行:(1月1日,0日)。當你使用「SUM」時,如果你沒有記錄,它將返回1行的空值,而不是沒有行。請在說法之前嘗試它不起作用。這並不是一個很好的方法,但它可以按預期工作。 – Rumpelstinsk

2

擁有所有月份的表,然後left join您的餐桌:

SELECT MONTHNAME(m.month) AS mName, 
    MONTH(m.month) AS mOrder, 
    ifnull(sum(amount),0) AS total_num 
from months m 
left join income i 
on m.month = i.date 

GROUP BY mOrder 
ORDER BY mOrder DESC 

如果你不想創建一個months表,然後你可以:

(select STR_TO_DATE('01/01/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/02/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/03/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/04/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/05/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/06/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/07/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/08/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/09/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/10/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/11/2016', '%d/%m/%Y') as month union 
select STR_TO_DATE('01/12/2016', '%d/%m/%Y') as month) 
+0

收集手段????一個名爲'月'的mysql表?你提到的是什麼'm.date'? –

+0

如何連接上面查詢後添加的這幾個月?請稍微幫忙。 –

+0

我也可以創建一個月表。不是問題。因爲我無法理解如何使用稍後在第一次SQL查詢中添加的那些選擇查詢。你能告訴我,如果我正在製作一個月份表,我應該添加哪些字段?或者請解釋我如何一起使用這兩個查詢:) –

0

您應該創建一個CALENDAR表,其中包含您需要的精度,在這種情況下爲幾個月。

+-----------+ 
| Month  | 
+-----------+ 
| January | 
| February |  
....... 

,並加入它