Beancount 查询语言 - 类 SQL 财务查询
Beancount 具有强大的类 SQL 查询语言 (BQL),可让你精确地切片、切块和分析你的财务数据。 无论你是想生成快速报告、调试条目还是执行复杂分析,掌握 BQL 都是释放你的纯文本会计账本的全部潜力的关键。 本指南将引导你了解其结构、功能和最佳实践。 🔍
查询结构和执行
BQL 的核心是其熟悉的、受 SQL 启发的语法。 查询使用 bean-query 命令行工具执行,该工具处理你的账本文件并将结果直接返回到你的终端。
基本查询格式
BQL 查询由三个主要子句组成:SELECT、FROM 和 WHERE。
SELECT <target1>, <target2>, ...
FROM <entry-filter-expression>
WHERE <posting-filter-expression>;
SELECT: 指定要检索的数据列。FROM: 在处理整个交易_之前_对其进行过滤。WHERE: 在选择交易后,过滤单个过账行。
两级过滤系统
理解 FROM 和 WHERE 子句之间的区别对于编写准确的查询至关重要。 BQL 使用两级过滤过程。
-
交易级别 (
FROM) 此子句对整个交易执行操作。 如果交易符合FROM条件,则_整个交易_(包括其所有过账)将传递到下一阶段。 这是过滤数据的主要方式,因为它保留了复式记账系统的完整性。 例如,过滤FROM year = 2024选择 2024 年发生的所有交易。 -
过账级别 (
WHERE) 此子句过滤由FROM子句选择的交易_内_的各个过账。 这对于演示和关注交易的特定部分很有用。 但是,请注意,在此级别进行过滤可能会“破坏”输出中交易的完整性,因为你可能只会看到条目的一侧。 例如,你可以选择所有到你的Expenses:Groceries帐户的过账。
数据模型
要有效地查询你的数据,你需要了解 Beancount 如何构建它。 账本是一个指令列表,但 BQL 主要关注 Transaction 条目。