【发布时间】:2019-08-31 15:29:51
【问题描述】:
您好,我正在制作一些会计软件,允许您存储多个月的交易(存储在表 transactions 中)并根据可用类别列表对这些交易进行分类(存储在表 categories 中)。最后每个月,用户可以创建一个预算,在其中构建一个列表(来自categories 的子集)并为每个条目分配一个目标。这些列表存储在表budget 中。
我需要一个查询来返回指定月份的支出和预算摘要。此摘要将是一个包含 categories.name、budget.goal 和 sum(transactions.amount) 的表。
有时,用户可能拥有指定月份的预算项目,但尚未与该类别进行任何交易(Out to Eat 示例)。有时,用户会出现他们没有预算的意外费用(汽车维修示例),并且在某些类别(如假期)中,用户没有为该项目预算并且没有该类别的费用。
SELECT categories.id, categories.name, SUM(transactions.amount)
FROM categories
LEFT JOIN transactions ON categories.id=transactions.category_id
WHERE transactions.date LIKE '2019-08-%' GROUP BY categories.id;
得到我想要的一半,并且
SELECT categories.id, categories.name, budgets.goal
FROM categories
LEFT JOIN budgets ON categories.id=budgets.category_id
WHERE budgets.date LIKE '2019-08-%' GROUP BY categories.id;
得到我想要的另一半。是否有一个查询可以返回如我上图所示的结果?如果我们可以排除目标和总和均为 NULL 的结果,我会更加激动。
【问题讨论】:
-
同一类别可以有多个同一月份的butgets吗?
-
了解 LEFT JOIN ON 返回的内容:INNER JOIN ON rows UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER JOIN ON 在 OUTER JOIN ON 删除任何由 NULL 扩展的行后,需要右 [sic] 表列不为 NULL,即只留下 INNER JOIN ON 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)
标签: mysql join foreign-keys relational-database primary-key