题目:
Customer
表:
+-------------+---------+ | Column Name | Type | +-------------+---------+ | customer_id | int | | product_key | int | +-------------+---------+ 该表可能包含重复的行。 customer_id 不为 NULL。 product_key 是 Product 表的外键(reference 列)。
Product
表:
+-------------+---------+ | Column Name | Type | +-------------+---------+ | product_key | int | +-------------+---------+ product_key 是这张表的主键(具有唯一值的列)。
编写解决方案,报告 Customer
表中购买了 Product
表中所有产品的客户的 id。
返回结果表 无顺序要求 。
返回结果格式如下所示。
示例 1:
输入: Customer 表: +-------------+-------------+ | customer_id | product_key | +-------------+-------------+ | 1 | 5 | | 2 | 6 | | 3 | 5 | | 3 | 6 | | 1 | 6 | +-------------+-------------+ Product 表: +-------------+ | product_key | +-------------+ | 5 | | 6 | +-------------+ 输出: +-------------+ | customer_id | +-------------+ | 1 | | 3 | +-------------+ 解释: 购买了所有产品(5 和 6)的客户的 id 是 1 和 3 。
题解:
方法一:两次分组,先选出每个顾客和产品的组合,并顺带去重。第二步按照顾客id分组并统计数目看那些与产品总数相等的就是要找的。
/* Write your T-SQL query statement below */
select
customer_id
from
--将顾客id和产品key相结合进行分组,相当于去重相同的id加key组合。
(select
*
from
Customer
group by
customer_id, product_Key) t1
group by
customer_id
having
--找出顾客出现次数等于产品数目的。
count(customer_id) = (
select
count(product_Key)
from
Product
)