技术问询:如何筛选购买过指定列表所有音乐流派的客户?
如何找到购买过所有流派音乐的客户?
你当前的SQL语句只是列出了客户及其购买过的音乐流派,但并没有筛选出购买过所有流派的客户。要实现需求,可以通过统计每个客户购买的独特流派数量,并与系统中总流派数量对比来完成,具体如下:
实现思路
- 计算系统中所有流派的总数量
- 分组统计每个客户购买过的独特流派数量
- 筛选出购买流派数量等于总流派数量的客户
完整SQL代码
WITH total_genres AS ( -- 统计系统中所有流派的总数 SELECT COUNT(DISTINCT genre_id) AS total FROM genre ), customer_purchased_genres AS ( -- 统计每个客户购买过的独特流派数量 SELECT customer.customer_id, CONCAT(customer.first_name, ' ', customer.last_name) AS customer_name, COUNT(DISTINCT genre.genre_id) AS purchased_count FROM customer JOIN invoice ON customer.customer_id = invoice.customer_id JOIN invoice_line ON invoice.invoice_id = invoice_line.invoice_id JOIN track ON invoice_line.track_id = track.track_id JOIN genre ON track.genre_id = genre.genre_id GROUP BY customer.customer_id, customer_name ) -- 筛选出购买过所有流派的客户 SELECT customer_name FROM customer_purchased_genres, total_genres WHERE purchased_count = total_genres.total;
代码说明
total_genres公共表表达式(CTE):先算出系统里一共有多少种不同的音乐流派customer_purchased_genresCTE:通过关联各表,按客户分组统计每个客户实际购买过的独特流派数量- 最后将两个结果关联,只保留购买流派数等于总流派数的客户,这些就是购买过所有流派音乐的客户
内容的提问来源于stack exchange,提问作者Gaganpreet Kaur
相关产品推荐
相关产品推荐

