MS Access中筛选多产品客户并汇总数据的SQL查询问题
解决MS Access中筛选同时拥有指定产品组合的客户并汇总数据的问题
原查询错误分析
你的查询返回空结果是因为两个关键逻辑错误:
- 分组错误:
GROUP BY同时包含了Client ID和Product ID,会按「客户+产品」的组合分组,无法得到客户级别的汇总结果。 - 条件矛盾:
HAVING子句中(Inventory.[Product ID]) = 20000 AND (Inventory.[Product ID]) = 20001不可能成立,单条记录的Product ID只能是一个值,无法同时等于两个不同的产品ID。
正确查询方案
以下两种方法均可实现需求,适配MS Access的语法:
方法1:使用子查询筛选符合条件的客户
SELECT i.[Client ID], SUM(i.Quantity) AS Quantity, SUM(i.[Contract Value]) AS [Contract Value] FROM Inventory i WHERE -- 子查询筛选同时拥有Product A(20000)和Product B(20001)的客户 i.[Client ID] IN ( SELECT [Client ID] FROM Inventory WHERE [Product ID] IN (20000, 20001) GROUP BY [Client ID] HAVING COUNT(DISTINCT [Product ID]) = 2 ) -- 仅汇总指定产品的数据 AND i.[Product ID] IN (20000, 20001) GROUP BY i.[Client ID];
方法2:使用EXISTS子句(适配不支持COUNT(DISTINCT)的旧版Access)
SELECT i.[Client ID], SUM(i.Quantity) AS Quantity, SUM(i.[Contract Value]) AS [Contract Value] FROM Inventory i WHERE -- 验证客户拥有Product A EXISTS ( SELECT 1 FROM Inventory i1 WHERE i1.[Client ID] = i.[Client ID] AND i1.[Product ID] = 20000 ) -- 验证客户拥有Product B AND EXISTS ( SELECT 1 FROM Inventory i2 WHERE i2.[Client ID] = i.[Client ID] AND i2.[Product ID] = 20001 ) -- 仅汇总指定产品的数据 AND i.[Product ID] IN (20000, 20001) GROUP BY i.[Client ID];
结果说明
两种方法都会返回你预期的结果:
| Client ID | Quantity | Contract Value |
|---|---|---|
| 1000 | 11 | 20,150 |
| 1010 | 71 | 140,150 |
内容的提问来源于stack exchange,提问作者user21323549
相关产品推荐
相关产品推荐

