gpt4 book ai didi

MYSQL:当没有值时返回零,按月分类

转载 作者:行者123 更新时间:2023-11-29 07:14:35 25 4
gpt4 key购买 nike

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

表事务:

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

我怀疑需要使用外部联接,但我还没有找到执行此操作的语句。

感谢您的帮助。

最佳答案

这应该会为您提供正确的结果。内部选择准备了一个包含所有月份和所有类别的列表,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:当没有值时返回零,按月分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com