如何用JOIN关联同表查询结果并统计购两款产品的客户数
用JOIN统计同时购买两款特定产品的客户数
假设你的订单表名为orders,包含customer_id(客户标识)和product_id(产品标识)两列,要统计同时购买两款特定产品(比如prod_A和prod_B)的客户数量,完全可以用JOIN实现,具体SQL语句如下:
SELECT COUNT(DISTINCT o1.customer_id) AS total_customers FROM orders o1 INNER JOIN orders o2 ON o1.customer_id = o2.customer_id WHERE o1.product_id = 'prod_A' -- 替换为第一款目标产品的标识 AND o2.product_id = 'prod_B'; -- 替换为第二款目标产品的标识
逻辑说明
- 自连接操作:将同一张订单表以
o1和o2为别名做自连接,通过customer_id关联,确保我们处理的是同一个客户的购买记录。 - 精准筛选:让
o1只保留购买了第一款产品的记录,o2只保留购买了第二款产品的记录,两者连接后得到的就是同时购买两款产品的客户数据。 - 去重统计:用
COUNT(DISTINCT)避免同一客户因多次购买同一产品被重复计数。
额外提供一种非JOIN的常用写法(供参考)
如果觉得自连接操作繁琐,也可以用分组筛选的方式实现相同效果:
SELECT COUNT(customer_id) AS total_customers FROM ( SELECT customer_id FROM orders WHERE product_id IN ('prod_A', 'prod_B') GROUP BY customer_id HAVING COUNT(DISTINCT product_id) = 2 ) AS filtered_customers;
这个思路是先筛选出购买过两款目标产品的所有记录,按客户分组后,只保留恰好购买了两款不同产品的客户,最后统计这些客户的数量。
内容的提问来源于stack exchange,提问作者Pipeloops
相关产品推荐
相关产品推荐

