MS Access左连接查询展示所有收入中心 无当月收入也保留行
问题根因
当前查询逻辑存在两个核心问题,导致仅当月无收入、历史月份有收入的中心被过滤:
- 日期筛选条件写在了最外层
WHERE子句中:左连接完成后,当月无收入但其他月份有数据的收入中心,关联出的行记录ITM_Date为非查询月份的值,不满足月份筛选条件,会被直接排除 - 原有逻辑中的
Year([ITM_Date]) Is Null判断,仅能覆盖从未产生过任何收入的收入中心(这类中心关联后所有发票字段全为NULL),无法覆盖有历史收入、仅当月无收入的场景
修正后的SQL
SELECT TSub_ItmNominal.ID_ItemNominal, TSub_ItmNominal.ItemNominal_Description, Sum(Nz(monthly_data.ITM_Net, 0)) AS ITM_Net_Total FROM TSub_ItmNominal LEFT JOIN ( -- 提前筛选指定年月的有效发票行数据,避免关联全量历史数据 SELECT T_LineItems.ITM_Nominal, T_LineItems.ITM_Net FROM T_Invoice INNER JOIN T_LineItems ON T_Invoice.ITM_Reference = T_LineItems.ITM_Reference WHERE Year(T_Invoice.ITM_Date) = [report_year] AND Month(T_Invoice.ITM_Date) = [report_month] ) AS monthly_data ON TSub_ItmNominal.ID_ItemNominal = monthly_data.ITM_Nominal WHERE TSub_ItmNominal.ID_ItemNominal Like "4*" GROUP BY TSub_ItmNominal.ID_ItemNominal, TSub_ItmNominal.ItemNominal_Description ORDER BY TSub_ItmNominal.ID_ItemNominal;
关键调整说明
- 将日期筛选逻辑下沉到左连接的子查询内部:子查询仅返回查询年月的有效发票行,不会带出其他月份的历史数据,左连接时未匹配到当月数据的收入中心,关联字段自动为NULL
- 移除了冗余的
IS NULL判断:未匹配到当月数据的收入中心,Nz函数会自动将NULL值转为0,求和后结果即为$0.00 - 将收入中心编码的筛选从
HAVING子句移到WHERE子句:编码是分组维度而非聚合计算结果,在WHERE层过滤执行效率更高 - 调整了发票表和行项目表的关联逻辑:将原来嵌套的
RIGHT JOIN改为更直观的INNER JOIN,避免多表关联顺序混乱导致的数据匹配错误
修正后所有编码以4开头的收入中心都会完整展示,当月无收入的中心对应金额会显示为$0.00,符合预期需求。
内容的提问来源于stack exchange,提问作者James Crafton
相关产品推荐
相关产品推荐

