力扣-市场分析

news/2024/7/6 22:22:55 标签: leetcode, sql, mysql, 数据库

大家好,我是空空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 的记录。


http://www.niftyadmin.cn/n/94642.html

相关文章

白帽黑客入行应该怎么学?零基础小白也能轻松上手!

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 1为什么网络安全行业是IT行业最后的红利? 根据腾讯安全发布的《互联网安全报告》,…

哪些骨传导运动蓝牙耳机好,分享几款不错的骨传导耳机

​骨传导耳机在运动中有很多优势,它是一款不入耳的耳机,适合在跑步、骑行、爬山等运动中使用,如果你是一个爱运动的人,骨传导耳机是不错的选择。由于骨传导技术不需要塞入耳朵中就能听到音乐,所以不会产生任何不适感。…

华为OD机试题,用 Java 解【最小施肥机能效】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

怎么在LinkedIn领英安全添加到3万个好友?

根据领英最新公布的数据:领英全球用户数已经达到8.3亿,超5800万个公司主页,可以说是世界上最-大的business database。 这就不难理解为什么越来越多的外贸人,开始认真尝试和重视在领英开发客户,因为领英确实是外贸人&a…

AcWing蓝桥杯辅导课:第一讲递推与递归

AcWing 92. 递归实现指数型枚举 思路: 方法一: 暴力枚举 用二进制加位运算枚举每一个状态,输出即可,时间复杂度为 O(N2N)O(N2^N)O(N2N) 代码: import java.util.Scanner;/*** Description* Author: PrinceHan* Cre…

劳保防护用品穿戴检测 python

劳保防护用品穿戴检测算法通过pythonOpencv深度学习技术,劳保防护用品穿戴检测算法对现场人员防护穿戴用品进行全天候检测,当检测到未按照要求进行穿戴,立即对现场违规人员进行抓拍。Python是一种由Guido van Rossum开发的通用编程语言&#…

C++模板元编程记录

C模板元编程基本技巧 C模板元编程是一种典型的函数式编程,核心是函数。不同于C程序中定义与使用的函数。 更接近数学意义上的函数。 constexpr int fun(int a){return a 1;}constexpr为C11关键字,表明该函数可在编译期调用,是一个元函数。…

git实战技巧-本地刚做出的修改、暂存和提交如何进行撤销

1、解决思路工作区和暂存区内容的撤销,直接按照对应命令或者IDEA界面完成操作就行。对于已提交的撤销回滚建议如下:1. 代码如果仅仅是回撤到指定版本,该版本之上的更新是不需要的,选择Hard模式。2. 代码回撤到指定版本时&#xff…