2010-02-12 5 views
1

I가 지출 카테고리 정보 기록 지출 등을 제공하는 다음 두 개의 테이블 :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/ 꽤 비슷 questions/1528688/mysql-count-return-zero-if-no-record-found – Wim

+1

나는 동의한다 - 비슷하지만 비슷하지는 않다. 제 경우에는 0이 아닌 카테고리를 한 번만 반복하지 않고 매월 반복해야합니다. – Damo

답변

2

올바른 결과를 제공해야합니다. inner select는 모든 카테고리와 모든 달의 목록을 준비하고 나머지는 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

Brilliant - 감사합니다. 그것은 완벽하게 작동합니다. – Damo

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

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