LeetCode MySQL 刷题条记 (九)

71 阅读2分钟

「4月日新计划更文活动」

题目:1393. 股票的资本损益

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| stock_name    | varchar |
| operation     | enum    |
| operation_day | int     |
| price         | int     |
+---------------+---------+
(stock_name, day) 是这张表的主键
operation 列使用的是一种枚举类型,包括:('Sell','Buy')
此表的每一行代表了名为 stock_name 的某支股票在 operation_day 这一天的操作价格。
保证股票的每次'Sell'操作前,都有相应的'Buy'操作。

需求

编写一个SQL查询来报告每支股票的资本损益。 股票的资本损益是一次或多次买卖股票后的全部收益或损失。 以任意顺序返回结果即可。

解析

# Write your MySQL query statement below

select stock_name, sum(case when operation ='buy' then -price else price end   )as capital_gain_loss from Stocks group by stock_name

# Write your MySQL query statement below

select a.stock_name,b.sell_price- a.buy_price 
as capital_gain_loss from  
(select stock_name,sum(price) as buy_price   from Stocks  
 where operation ='buy' group by stock_name) a 
join ( select stock_name,sum(price) as sell_price  from Stocks 
where operation ='Sell' group by stock_name) b  
on  a.stock_name =b.stock_name

题目:1407. 排名靠前的旅行者

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
id 是该表单主键。
name 是用户名字。

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| user_id       | int     |
| distance      | int     |
+---------------+---------+
id 是该表单主键。
user_id 是本次行程的用户的 id, 而该用户此次行程距离为 distance 。

需求

写一段 SQL , 报告每个用户的旅行距离。

返回的结果表单,以 travelled_distance 降序排列 ,如果有两个或者更多的用户旅行了相同的距离, 那么再以 name 升序排列 。

解析

# Write your MySQL query statement below

select  a.name ,ifnull(sum(b.distance),0)  as travelled_distance
from Users  a left  outer join Rides b 
on  a.id= b.user_id  group by a.id  
order by travelled_distance  desc ,a.name asc

题目:1158. 市场分析 I

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| join_date      | date    |
| favorite_brand | varchar |
+----------------+---------+
此表主键是 user_id。
表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。

+---------------+---------+
| 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)。

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| item_id       | int     |
| item_brand    | varchar |
+---------------+---------+
此表主键是 item_id。

需求

请写出一条SQL语句以查询每个用户的注册日期和在 **2019 **年作为买家的订单总数。 以 任意顺序 返回结果表。

解析

# Write your MySQL query statement below

# select * from  year(order_date) = 2019
select a.user_id  as buyer_id, a.join_date ,count(order_id) as orders_in_2019  from Users a left outer join Orders b on a.user_id  = b.buyer_id  and   year(order_date) = 2019 group by user_id  

知识点

IFNUll

  • 定义:它本身不是一个函数也不是一个完整sql表达式,在这里我只是表达了一种使用方法
  • 语句格式IFNULL(column_name, value_if_null)
  • 解释:如果列(column_name)的值不为NULL,则返回该值,否则返回指定的value_if_null值
  • 栗子:🌰1407 ifnull(sum(b.distance),0)
  • 解析1407 :在做这道题时,发现的解题思路,需要使用left 左关联user表格,不然会出现无法查出距离为0的user数据 ,并且 group by 要用id判断,因为id的唯一性,姓名不是