大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。
文章目录
- 前言
- 一、题目:1158. 市场分析
- 二、解题
- 1.错误示范①
- 提交SQL
- 运行结果
- 2.正确示范①
- 提交SQL
- 运行结果
- 3.错误示范②
- 提交SQL
- 运行结果
- 4.正确示范②
- 提交SQL
- 运行结果
- 5.其他
- 总结
前言
一、题目:1158. 市场分析
Table: Users
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| user_id | int |
| join_date | date |
| favorite_brand | varchar |
+----------------+---------+
此表主键是 user_id。
表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。
Table: Orders
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| order_id | int |
| order_date | date |
| item_id | int |
| buyer_id | int |
| seller_id | int |
+---------------+---------+
此表主键是 order_id。
外键是 item_id 和(buyer_id,seller_id)。
Table: Items
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| item_id | int |
| item_brand | varchar |
+---------------+---------+
此表主键是 item_id。
请写出一条SQL语句以查询每个用户的注册日期和在 2019 年作为买家的订单总数。
以 任意顺序 返回结果表。
查询结果格式如下。
示例 1:
输入:
Users 表:
+---------+------------+----------------+
| user_id | join_date | favorite_brand |
+---------+------------+----------------+
| 1 | 2018-01-01 | Lenovo |
| 2 | 2018-02-09 | Samsung |
| 3 | 2018-01-19 | LG |
| 4 | 2018-05-21 | HP |
+---------+------------+----------------+
Orders 表:
+----------+------------+---------+----------+-----------+
| order_id | order_date | item_id | buyer_id | seller_id |
+----------+------------+---------+----------+-----------+
| 1 | 2019-08-01 | 4 | 1 | 2 |
| 2 | 2018-08-02 | 2 | 1 | 3 |
| 3 | 2019-08-03 | 3 | 2 | 3 |
| 4 | 2018-08-04 | 1 | 4 | 2 |
| 5 | 2018-08-04 | 1 | 3 | 4 |
| 6 | 2019-08-05 | 2 | 2 | 4 |
+----------+------------+---------+----------+-----------+
Items 表:
+---------+------------+
| item_id | item_brand |
+---------+------------+
| 1 | Samsung |
| 2 | Lenovo |
| 3 | LG |
| 4 | HP |
+---------+------------+
输出:
+-----------+------------+----------------+
| buyer_id | join_date | orders_in_2019 |
+-----------+------------+----------------+
| 1 | 2018-01-01 | 1 |
| 2 | 2018-02-09 | 2 |
| 3 | 2018-01-19 | 0 |
| 4 | 2018-05-21 | 0 |
+-----------+------------+----------------+
二、解题
1.错误示范①
提交SQL
sql">select u1.user_id buyer_id,
u1.join_date,
count(1) orders_in_2019
from Users u1
left join Orders u2
on u1.user_id=u2.buyer_id and substr(u2.order_date,1,4)='2019'
group by u1.user_id,u1.join_date
运行结果
2.正确示范①
提交SQL
sql">select u1.user_id buyer_id,
u1.join_date,
count(u2.order_id) orders_in_2019
from Users u1
left join Orders u2
on u1.user_id=u2.buyer_id and substr(u2.order_date,1,4)='2019'
group by u1.user_id,u1.join_date
运行结果
3.错误示范②
提交SQL
sql">select u1.user_id buyer_id,
u1.join_date,
u2.num orders_in_2019
from Users u1
left join (
select buyer_id,count(1) num
from Orders
where substr(order_date,1,4)='2019'
group by buyer_id
) u2
on u1.user_id=u2.buyer_id
运行结果
4.正确示范②
提交SQL
sql">select u1.user_id buyer_id,
u1.join_date,
ifnull(u2.num,0) orders_in_2019
from Users u1
left join (
select buyer_id,count(1) num
from Orders
where substr(order_date,1,4)='2019'
group by buyer_id
) u2
on u1.user_id=u2.buyer_id
或者
sql">select u1.user_id buyer_id,
u1.join_date,
# ifnull(u2.num,0) orders_in_2019
case when u2.num is null then 0 else u2.num end as orders_in_2019
from Users u1
left join (
select buyer_id,count(1) num
from Orders
where substr(order_date,1,4)='2019'
group by buyer_id
) u2
on u1.user_id=u2.buyer_id
或者
sql">select u1.user_id buyer_id,
u1.join_date,
ifnull(u2.num,0) orders_in_2019
from Users u1
left join (
select buyer_id,count(1) num
from Orders
where year(order_date)='2019'
group by buyer_id
) u2
on u1.user_id=u2.buyer_id
运行结果
5.其他
总结
错误示范①错在返回的无订单数是仍是1,应该把count(1)改为count(u2.order_id);
错误示范②错在返回的无订单数是null,应该把null转换成0;
知识点:
取2019年可以用substr(order_date,1,4)=‘2019’,也可以用year(order_date)=‘2019’;
将null转换成0可以用ifnull(u2.num,0),也可以用case when u2.num is null then 0 else u2.num end;
count(1)和count(指定字段)区别:
count(1) 会统计表中的所有的记录数,同count(*) ,包含字段为null 的记录。
count(指定字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。不统计字段为null 的记录。