MYSQL:不存在值时返回零,按月分类

MYSQL:不存在值时返回零,按月分类,mysql,join,return,zero,categorization,Mysql,Join,Return,Zero,Categorization,我有以下两个表格记录支出并提供支出类别信息: 表事务: +-------+--------+--------+ | month | cat_id | amount | +-------+--------+--------+ | 1 | 2 | 3 | | 1 | 2 | 8 | | 2 | 1 | 7 | | 2 | 1 | 5 | +-------+--------+--------

我有以下两个表格记录支出并提供支出类别信息:

表事务:

+-------+--------+--------+
| 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 |
+-------+-------------+--------+
我怀疑需要使用外部联接,但我还没有找到一个语句来执行此操作


谢谢您的帮助。

这一条应该会为您提供正确的结果。内部选择将准备一个包含所有月份和所有类别的列表,而
左连接将处理其余月份

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

看起来很像我同意-很像,但不一样。在我的例子中,任何零金额类别都需要每月重复,而不是只重复一次。谢谢你的回复,但它不起作用。使用您的SQL,我得到的是:1 |库存| 2 | 12 | 2 |耗材| 1 | 11 |很抱歉格式化
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