「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的唯一性,姓名不是