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

+-------+--------+--------+
| 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将准备一个包含所有月份和所有类别的列表,而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

关于mysql - MYSQL:不存在任何值时返回零,按月分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2255531/

10-09 01:00