MS Access中SQL统计时Count函数返回错误计数结果的问题排查
问题原因
- 两表INNER JOIN后会生成笛卡尔积扩展行数:1个样地对应多棵树木,关联结果集中同一个
T_Plots.ID_plot会重复出现,重复次数等于该样地内的树木总棵数。 COUNT()函数默认统计所有非空值的行数,不会自动去重,因此你写的Count(T_Plots.ID_plot)实际统计的是对应林分类型下的总树木行数,和Count(T_Trees.ID_Tree)结果自然完全一致,远高于实际样地数量。
解决方法
统计样地数量时添加DISTINCT关键字对样地ID去重,同一个样地无论对应多少棵树仅计数1次,修改后语句如下:
SELECT T_Plots.Forest_type, Count(DISTINCT T_Plots.ID_plot) AS [Plots/Forest Type], Count(T_Trees.ID_Tree) AS [Trees/Forest Type], [Trees/Forest Type]/[Plots/Forest Type]*10 AS [Trees/Ha], Avg([T_Trees.DBH (cm)])/100*Avg([T_Trees.Height (m)])*0.7*[Trees/Ha] AS [Volume (m3)/Ha], 3.142*(((Avg([T_Trees.DBH (cm)])/2)^2)/100)*[Trees/Ha] AS [BA (m2)/Ha] FROM T_Plots INNER JOIN T_Trees ON T_Plots.ID_plot = T_Trees.ID_plot GROUP BY T_Plots.Forest_type
如果你的数据库不支持COUNT(DISTINCT)语法,也可以先单独统计每个林分类型的样地数量,再和树木统计结果做关联计算。
内容的提问来源于stack exchange,提问作者FlightlessDutchman
相关产品推荐
相关产品推荐

