2010-02-12 39 views
1

我有以下兩個表記錄支出,並提供支出類別的信息:MYSQL:返回零點時沒有值,分爲每月

表交易:

+-------+--------+--------+ 
| month | cat_id | amount | 
+-------+--------+--------+ 
|  1 |  2 |  3 | 
|  1 |  2 |  8 | 
|  2 |  1 |  7 | 
|  2 |  1 |  5 | 
+-------+--------+--------+ 

表類:

+--------+-------------+ 
| cat_id | cat_desc | 
+--------+-------------+ 
|  1 | Stock  | 
|  2 | Consumables | 
+--------+-------------+ 

我想什麼是構造顯示每個類別的金額之和的查詢,每月,即使在美食沒有支出血淋淋的當月這樣的:

+-------+-------------+--------+ 
| month | cat_desc | amount | 
+-------+-------------+--------+ 
|  1 | Stock  |  0 | 
|  1 | Consumables |  11 | 
|  2 | Stock  |  12 | 
|  2 | Consumables |  0 | 
+-------+-------------+--------+ 

我懷疑外連接將需要使用,但我還沒有找到一個語句來完成它。

謝謝你的幫助。

+1

看起來非常相似http://stackoverflow.com/問題/ 1528688/mysql-count-return-zero-if-no-record-found – Wim 2010-02-12 22:27:02

+1

我同意 - 它是相似的,但不一樣。就我而言,任何零金額的類別都需要每個月重複一次,而不是一次。 – Damo 2010-02-12 22:46:20

回答

2

這一個應該爲您提供正確的結果。內部選擇準備與所有類別結合的所有月份的列表,並且LEFT JOIN處理其餘的。

SELECT t.month, t.cat_desc, COALESCE(SUM(t2.amount), 0) amount 
FROM (
    SELECT DISTINCT t.month, c.cat_id, c.cat_desc 
    FROM categories c 
    CROSS JOIN transactions t 
) t 
LEFT JOIN transactions t2 ON (t2.month = t.month AND t2.cat_id = t.cat_id) 
GROUP BY t.month, t.cat_desc 

性能可能會更好以下(使用DISTINCT僅在必要時),但你必須嘗試:

SELECT t.month, t.cat_desc, COALESCE(SUM(t2.amount), 0) amount FROM (
    SELECT t.month, c.cat_id, c.cat_desc 
    FROM 
    (SELECT DISTINCT month FROM transactions) t 
    CROSS JOIN categories c 
) t 
LEFT JOIN transactions t2 ON (t2.month = t.month AND t2.cat_id = t.cat_id) 
GROUP BY t.month, t.cat_desc 
+0

輝煌 - 謝謝。它完美的作品。 – Damo 2010-02-12 22:52:55

0
SELECT c.cat_id, c.cat_desc,t.month, SUM(t.amount) 
FROM categories c 
LEFT JOIN transactions t ON (t.cat_id = c.cat_id) 
GROUP BY c.cat_id,t.month 
+0

感謝您的回覆,但它沒有奏效。使用你的SQL,這是我得到的: 1 |股票| 2 | 12 | 2 |消耗品| 1 | 11 | 對不起格式 – Damo 2010-02-12 22:38:46

0
SELECT c.cat_id, c.cat_desc,t.month, SUM(t.amount) 
FROM categories c 
LEFT JOIN transactions t ON (t.cat_id = c.cat_id) 
GROUP BY t.month,c.cat_id 
Order By t.month