1445. 苹果和桔子+1393. 股票的资本损益+1270. 向公司CEO汇报工作的所有人+1285. 找到连续区间的开始和结束数字

转载:
声明:如果我侵犯了任何人的权利,请联系我,我会删除
欢迎高手来喷我

1445. 苹果和桔子

链接:https://leetcode-cn.com/problems/apples-oranges

题目描述

表: Sales

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| sale_date | date |
| fruit | enum |
| sold_num | int |
±--------------±--------+
(sale_date,fruit) 是该表主键.
该表包含了每一天中"苹果" 和 "桔子"的销售情况.

写一个 SQL 查询, 报告每一天 苹果 和 桔子 销售的数目的差异.

返回的结果表, 按照格式为 (‘YYYY-MM-DD’) 的 sale_date 排序.

查询结果表如下例所示:

Sales 表:
±-----------±-----------±------------+
| sale_date | fruit | sold_num |
±-----------±-----------±------------+
| 2020-05-01 | apples | 10 |
| 2020-05-01 | oranges | 8 |
| 2020-05-02 | apples | 15 |
| 2020-05-02 | oranges | 15 |
| 2020-05-03 | apples | 20 |
| 2020-05-03 | oranges | 0 |
| 2020-05-04 | apples | 15 |
| 2020-05-04 | oranges | 16 |
±-----------±-----------±------------+

Result 表:
±-----------±-------------+
| sale_date | diff |
±-----------±-------------+
| 2020-05-01 | 2 |
| 2020-05-02 | 0 |
| 2020-05-03 | 20 |
| 2020-05-04 | -1 |
±-----------±-------------+

在 2020-05-01, 卖了 10 个苹果 和 8 个桔子 (差异为 10 - 8 = 2).
在 2020-05-02, 卖了 15 个苹果 和 15 个桔子 (差异为 15 - 15 = 0).
在 2020-05-03, 卖了 20 个苹果 和 0 个桔子 (差异为 20 - 0 = 20).
在 2020-05-04, 卖了 15 个苹果 和 16 个桔子 (差异为 15 - 16 = -1).

题解

select a.sale_date as sale_date, (a.apple_sum-a.orange_sum) as diff from
(
select sale_date,
sum(case when fruit = 'apples' then sold_num else 0 end) as apple_sum,
sum(case when fruit = 'oranges' then sold_num else 0 end) as orange_sum
from Sales 
group by sale_date
) a
group by sale_date
order by sale_date
select sale_date, sum(case when fruit='apples' then sold_num else -sold_num end) as diff
from Sales
group by sale_date
order by sale_date

1393. 股票的资本损益

链接:https://leetcode-cn.com/problems/capital-gainloss

题目描述

Stocks 表:

±--------------±--------+
| 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查询来报告每支股票的资本损益。

股票的资本损益是一次或多次买卖股票后的全部收益或损失。

以任意顺序返回结果即可。

SQL查询结果的格式如下例所示:

Stocks 表:
在这里插入图片描述
在这里插入图片描述

Leetcode 股票在第一天以1000美元的价格买入,在第五天以9000美元的价格卖出。资本收益=9000-1000=8000美元。
Handbags 股票在第17天以30000美元的价格买入,在第29天以7000美元的价格卖出。资本损失=7000-30000=-23000美元。
Corona Masks 股票在第1天以10美元的价格买入,在第3天以1010美元的价格卖出。在第4天以1000美元的价格再次购买,在第5天以500美元的价格出售。最后,它在第6天以1000美元的价格被买走,在第10天以10000美元的价格被卖掉。资本损益是每次(’Buy’->‘Sell’)操作资本收益或损失的和=(1010-10)+(500-1000)+(10000-1000)=1000-500+9000=9500美元。

题解

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

1270. 向公司CEO汇报工作的所有人

链接:https://leetcode-cn.com/problems/all-people-report-to-the-given-manager

题目描述

员工表:Employees
在这里插入图片描述
employee_id 是这个表的主键。
这个表中每一行中,employee_id 表示职工的 ID,employee_name 表示职工的名字,manager_id 表示该职工汇报工作的直线经理。
这个公司 CEO 是 employee_id = 1 的人。

用 SQL 查询出所有直接或间接向公司 CEO 汇报工作的职工的 employee_id 。

由于公司规模较小,经理之间的间接关系不超过 3 个经理。

可以以任何顺序返回的结果,不需要去重。

查询结果示例如下:
在这里插入图片描述
公司 CEO 的 employee_id 是 1.
employee_id 是 2 和 77 的职员直接汇报给公司 CEO。
employee_id 是 4 的职员间接汇报给公司 CEO 4 --> 2 --> 1 。
employee_id 是 7 的职员间接汇报给公司 CEO 7 --> 4 --> 2 --> 1 。
employee_id 是 3, 8 ,9 的职员不会直接或间接的汇报给公司 CEO。

题解

SELECT e1.employee_id
FROM Employees e1
JOIN Employees e2 ON e1.manager_id = e2.employee_id
JOIN Employees e3 ON e2.manager_id = e3.employee_id
WHERE e1.employee_id != 1 AND e3.manager_id = 1 
 select employee_id from Employees e
 where e.manager_id = 1 and e.employee_id != 1
 or e.manager_id in
 (
     select employee_id from Employees e1
     where e1.manager_id = 1 and e1.employee_id != 1
 )
 or e.manager_id in
 (
     select employee_id from Employees e2
     where e2.manager_id = 1 and e2.employee_id != 1
     or e2.manager_id in
     (
         select employee_id from Employees e3 
         where e3.manager_id = 1 and e3.employee_id != 1
     )
 )
 

1285. 找到连续区间的开始和结束数字

链接:https://leetcode-cn.com/problems/find-the-start-and-end-number-of-continuous-ranges

题目描述

在这里插入图片描述
id 是上表的主键。
上表的每一行包含日志表中的一个 ID。

后来一些 ID 从 Logs 表中删除。编写一个 SQL 查询得到 Logs 表中的连续区间的开始数字和结束数字。

将查询表按照 start_id 排序。

查询结果格式如下面的例子:
在这里插入图片描述

结果表应包含 Logs 表中的所有区间。
从 1 到 3 在表中。
从 4 到 6 不在表中。
从 7 到 8 在表中。
9 不在表中。
10 在表中。

题解

# Write your MySQL query statement below
select a.log_id as start_id, b.log_id as end_id from
(
    select log_id from Logs where (log_id -1) not in (select * from Logs)
) a,
(
    select log_id from Logs where (log_id + 1) not in (select * from Logs)
)b
where a.log_id <= b.log_id
group by a.log_id;

猜你喜欢

转载自blog.csdn.net/qq_45531729/article/details/112297713
今日推荐