如何通过查询过滤Access子报表中重复产品的附件字段显示
解决Access子报表中产品附件重复显示的问题
首先得指出你原来查询里的一个关键问题:你包含了OrderDetailsTbl.OrderDetailsID这个字段,而每个订单明细的ID都是唯一的——这就导致哪怕是同一个产品,每一行因为ID不同都会被视为不同的记录,所以去重逻辑根本没法生效。所以第一步必须把这个字段从SELECT列表里删掉。
接下来给你两种简单的修改方案,都能实现产品名称/ID唯一、附件只显示一次的需求:
方案1:用DISTINCT快速去重
这是最直接的方式,适合只需要单纯去重的场景:
SELECT DISTINCT ProductTbl.ProductID, ProductTbl.ServiceNaam, ProductTbl.omschrijving, ProductTbl.[你的附件字段名称] -- 记得替换成实际的附件字段名 FROM ProductTbl INNER JOIN OrderDetailsTbl ON ProductTbl.ProductID = OrderDetailsTbl.ProductID;
DISTINCT会自动检查所有返回字段的组合,只要完全重复就只保留一行。因为同一个产品的这些字段值都是一致的,所以最终每个产品只会出现一次。
方案2:用GROUP BY(适合后续扩展统计)
如果之后你想给子报表加一些统计信息(比如这个产品被订购了多少次),用GROUP BY会更灵活:
SELECT ProductTbl.ProductID, ProductTbl.ServiceNaam, ProductTbl.omschrijving, ProductTbl.[你的附件字段名称], Count(OrderDetailsTbl.OrderDetailsID) AS 订购次数 -- 可选:添加统计字段 FROM ProductTbl INNER JOIN OrderDetailsTbl ON ProductTbl.ProductID = OrderDetailsTbl.ProductID GROUP BY ProductTbl.ProductID, ProductTbl.ServiceNaam, ProductTbl.omschrijving, ProductTbl.[你的附件字段名称];
GROUP BY会按照你指定的字段分组,每个产品对应一个分组,自然只返回一行。如果需要统计,直接在SELECT里加聚合函数就行。
特殊情况:附件存在于订单明细中
如果你的附件字段是存在于OrderDetailsTbl里(而不是产品表),且同一个产品的不同订单明细附件可能不同,那你需要指定取哪一个附件,比如取第一个出现的:
SELECT ProductTbl.ProductID, ProductTbl.ServiceNaam, ProductTbl.omschrijving, First(OrderDetailsTbl.[附件字段名]) AS 显示的附件 FROM ProductTbl INNER JOIN OrderDetailsTbl ON ProductTbl.ProductID = OrderDetailsTbl.ProductID GROUP BY ProductTbl.ProductID, ProductTbl.ServiceNaam, ProductTbl.omschrijving;
把修改后的查询设置为子报表的数据源,就能解决重复显示的问题了。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

