Access技术问询:如何按motherID汇总多子表的value字段值
Access多子表按主表ID汇总的正确写法
这种情况我之前也踩过坑——直接把主表和多个子表做连接,很容易因为子表的多行记录产生笛卡尔积,导致汇总数值被重复计算,结果自然不对。下面给你两种靠谱的解决办法:
方法一:先单独汇总各子表,再左连接主表
先给每个子表创建单独的汇总查询,确保每个motherID只对应一条汇总记录,再和主表做左连接就不会有重复问题了。
步骤1:创建子表汇总查询
分别为三个子表创建汇总查询(可以在Access查询设计器里操作,也直接写SQL):
- 针对
tblChildOne的汇总查询(命名为qrySumChild1):
SELECT motherID, Sum(value) AS SumValueChild1 FROM tblChildOne GROUP BY motherID;
- 针对
tblChildTwo的汇总查询(命名为qrySumChild2):
SELECT motherID, Sum(value) AS SumValueChild2 FROM tblChildTwo GROUP BY motherID;
- 针对
tblChildThree的汇总查询(命名为qrySumChild3):
SELECT motherID, Sum(value) AS SumValueChild3 FROM tblChildThree GROUP BY motherID;
步骤2:主表与汇总查询左连接
把主表和这三个汇总查询做左连接,同时用Nz()函数处理空值(避免某个motherID在子表无记录时显示Null):
SELECT m.id AS motherID, m.text, Nz(sc1.SumValueChild1, 0) AS SumValueChild1, Nz(sc2.SumValueChild2, 0) AS SumValueChild2, Nz(sc3.SumValueChild3, 0) AS SumValueChild3 FROM ((tblMother m LEFT JOIN qrySumChild1 sc1 ON m.id = sc1.motherID) LEFT JOIN qrySumChild2 sc2 ON m.id = sc2.motherID) LEFT JOIN qrySumChild3 sc3 ON m.id = sc3.motherID;
方法二:直接在主查询中嵌套子查询(更紧凑)
如果不想单独创建子查询,可以直接在主查询里用关联子查询,每个子查询单独计算对应子表的汇总值:
SELECT m.id AS motherID, m.text, Nz((SELECT Sum(value) FROM tblChildOne WHERE motherID = m.id), 0) AS SumValueChild1, Nz((SELECT Sum(value) FROM tblChildTwo WHERE motherID = m.id), 0) AS SumValueChild2, Nz((SELECT Sum(value) FROM tblChildThree WHERE motherID = m.id), 0) AS SumValueChild3 FROM tblMother m;
两种方法都能得到你想要的输出格式,而且不会出现汇总错误的问题。如果某个motherID在某个子表里没有记录,Nz()函数会把默认的Null转换成0,让结果更整洁。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

