力扣1083-销售分析II

表:Product

复制代码
+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
| unit_price   | int     |
+--------------+---------+
Product_id 是该表的主键(具有唯一值的列)。
该表的每一行表示每种产品的名称和价格。

表:Sales

复制代码
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| seller_id   | int     |
| product_id  | int     |
| buyer_id    | int     |
| sale_date   | date    |
| quantity    | int     |
| price       | int     |
+------ ------+---------+
这个表可能有重复的行。
product_id 是 Product 表的外键(reference 列)。
buyer_id 永远不会是 NULL。
sale_date 永远不会是 NULL。
该表的每一行都包含一次销售的一些信息。

编写一个解决方案,报告那些买了 S8 而没有买 iPhone买家 。注意,S8iPhoneProduct 表中显示的产品。

任意顺序 返回结果表。

结果格式如下所示。

示例 1:

复制代码
输入:
Product table:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+
Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 1          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 3        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
输出:
+-------------+
| buyer_id    |
+-------------+
| 1           |
+-------------+
解释:
id 为 1 的买家购买了一部 S8,但是却没有购买 iPhone,而 id 为 3 的买家却同时购买了这 2 部手机。

思路:

1、首先两个表关联;

2、case when 判断是否有卖S8和iPhone,有为1 否则为0

3、根据题目要求,"买了 S8 而没有买 iPhone买家",所以sum(S8)>0 ,sum(iPhone)=0;

代码:

sql 复制代码
select 
buyer_id 
from product t1
join sales t2 on t1.product_id= t2.product_id
group by buyer_id
having sum(case when product_name = 'S8'then 1 else 0 end) > 0 
   and sum(case when product_name = 'iPhone' then 1 else 0 end) = 0
;
相关推荐
Tisfy5 小时前
LeetCode 3720.大于目标字符串的最小字典序排列:状态机 —— :从左往右枚举,失败则退回(最多退回一次)
linux·数据库·leetcode·字符串·状态机·构造
Java小白笔记5 小时前
Codex CLI 使用与斜杠指令实战教程
服务器·数据库·oracle
养生技术人5 小时前
Oracle OCP认证考试题目详解082系列第16题
数据库·sql·oracle·ocp
惜分飞6 小时前
kcratr_nab_less_than_odr和system坏块故障处理
数据库·oracle
数智启示录6 小时前
实时数据湖 Flink CDC + Kafka +Doris 【企业级实战】之Kafka 事件缓冲层 【附核心源码】 04
java·大数据·flink·kafka·数据库开发
惜分飞6 小时前
obet forcecopy功能抢救硬件故障中的数据文件
数据库·oracle
Java小白笔记7 小时前
Java中PDF文件导出,生成链路与实现
服务器·网络·oracle
土司大王7 小时前
LeetCode hot100——二叉树的最大深度
算法·leetcode·职场和发展
圣保罗的大教堂7 小时前
leetcode 3720. 大于目标字符串的最小字典序排列 中等
leetcode
小江的记录本8 小时前
【ORM框架】MyBatis核心原理、ORM思想、MyBatis vs JPA
java·数据库·后端·spring·spring cloud·oracle·mybatis