mysql刷题记录
刷题链接https://leetcode.cn/study-plan/sql/?progress=jkih0qc
mysql冲!
- mysql刷题记录
- 一. 1699. 两人之间的通话次数
- 题
- 解
- 二、1251. 平均售价
- 题
- 解
- 三. 1571. 仓库经理
- 题
- 解
- 四.1445. 苹果和桔子
- 解
- 五.1193. 每月交易 I
- 题
- 解
- 六.1633. 各赛事的用户注册率
- 题
- 解
- 七.1173. 即时食物配送 I
- 题
- 解
- 八.1211. 查询结果的质量和占比
- 题
- 解
一. 1699. 两人之间的通话次数
题
编写 SQL 语句,查询每一对用户 (person1, person2) 之间的通话次数和通话总时长,其中 person1 < person2 。
该表没有主键,可能存在重复项。
该表包含 from_id 与 to_id 间的一次电话的时长。
from_id != to_id
示例 :
解释:
用户 1 和 2 打过 2 次电话,总时长为 70 (59 + 11)。
用户 1 和 3 打过 1 次电话,总时长为 20。
用户 3 和 4 打过 4 次电话,总时长为 999 (100 + 200 + 200 + 499)。
解
解法一
select
least(from_id, to_id) person1,
greatest(from_id, to_id) person2,
count(1) call_count,--count(1)≈count(*)统计列个数
sum(duration) total_duration
from
Calls
group by
least(from_id, to_id), greatest(from_id, to_id);
--根据最小,最大值相同点去判断
解法二
select
if(from_id<to_id,from_id,to_id) person1,
if(from_id<to_id,to_id,from_id) person2,
count(1) call_count,
sum(duration) total_duration
from
Calls
group by
person1,person2;
知识点:
-
least():一条记录中取几个字段的最小值
greates(): 一条记录中取几个字段的最大值
eg:
SELECT greatest(3,5,1,8,33,99,34,55,67,43) as max;
结果:99 -
if语句语法:
if(条件,如果是,如果不是) -
group by分组匹配,可以多条件
二、1251. 平均售价
题
编写SQL查询以查找每种产品的平均售价。
average_price 应该四舍五入到小数点后两位。
units是卖出多少个
解
--每个价格的销售总额为 对应时间内的价格∗对应时间内的数量对应时间内的价格 * 对应时间内的数量对应时间内的价格∗对应时间内的数量。
--因为价格和时间在 Prices 表中,数量在 UnitsSold 表中,这两个表通过 product_id 关联
select
p.product_id,
round(sum(u.units * p.price)/sum(u.units),2) as average_price
from
Prices p inner join UnitsSold u
on
p.product_id=u.product_id
and u.purchase_date between p.start_date and p.end_date
group by p.product_id;-- 先按产品分类
知识点:
- inner join……on显式内连接
- round(~,小数位数):保留n位小数
三. 1571. 仓库经理
题
写一个 SQL 查询来报告, 每个仓库的存货量是多少立方英尺.
返回结果没有顺序要求.
解释:
Id为1的商品(LC-TV)的存货量为 5x50x40 = 10000
Id为2的商品(LC-KeyChain)的存货量为 5x5x5 = 125
Id为3的商品(LC-Phone)的存货量为 2x10x10 = 200
Id为4的商品(LC-T-Shirt)的存货量为 4x10x20 = 800
仓库LCHouse1: 1个单位的LC-TV + 10个单位的LC-KeyChain + 5个单位的LC-Phone.
总存货量为: 110000 + 10125 + 5200 = 12250 立方英尺
仓库LCHouse2: 2个单位的LC-TV + 2个单位的LC-KeyChain.
总存货量为: 210000 + 2125 = 20250 立方英尺
仓库LCHouse3: 1个单位的LC-T-Shirt.
总存货量为: 1800 = 800 立方英尺.
解
-- 第一个自己写出来的sql题!
--先分组,再按分组计算体积*数量
select
w.name WAREHOUSE_NAME,
sum(p.Width*p.Length*p.Height*w.units) VOLUME
from
Warehouse w,
Products p
where
w.product_id = p.product_id
group by
WAREHOUSE_NAME;
四.1445. 苹果和桔子
写一个 SQL 查询, 报告每一天 苹果 和 桔子 销售的数目的差异.
返回的结果表, 按照格式为 (‘YYYY-MM-DD’) 的 sale_date 排序.
解
select
s.sale_date,
s.sold_num-a.sold_num diff
from
Sales s,Sales a
where
s.sale_date=a.sale_date and
s.fruit='apples' and a.fruit='oranges'
group by s.sale_date
五.1193. 每月交易 I
题
编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。
以 任意顺序 返回结果表。
解
select
DATE_FORMAT(t.trans_date, '%Y-%m') month ,
t.country country ,
count(1) trans_count ,
count(if(t.state='approved',1,NULL)) approved_count,
sum(t.amount) trans_total_amount,
sum(if(t.state='approved',amount,0)) approved_total_amount
from
Transactions t
group by
DATE_FORMAT(t.trans_date, '%Y-%m'),t.country;-- 按照国家,年月分类
知识点:
- DATE_FORMAT(t.trans_date, ‘%Y-%m’),数据表中的 trans_date 是精确到日,我们可以使用 DATE_FORMAT() 函数将日期按照年月 %Y-%m 输出。比如将 2019-01-02 转换成 2019-01
- if用法:if(t.state=‘approved’,1,NULL),如果(t.state=‘approved’)成立,就返回1,不成立就返回null
六.1633. 各赛事的用户注册率
题
写一条 SQL 语句,查询各赛事的用户注册百分率,保留两位小数。
返回的结果表按 percentage 的 降序 排序,若相同则按 contest_id 的 升序 排序。
解释:
所有用户都注册了 208、209 和 210 赛事,因此这些赛事的注册率为 100% ,我们按 contest_id 的降序排序加入结果表中。
Alice 和 Alex 注册了 215 赛事,注册率为 ((2/3) * 100) = 66.67%
Bob 注册了 207 赛事,注册率为 ((1/3) * 100) = 33.33%
解
select
--先按id分组,round保留两位小数
r.contest_id contest_id,
round(100*count(1)/(select count(1) from users),2) percentage
from
Register r
group by
r.contest_id
order by
percentage desc,contest_id asc;
七.1173. 即时食物配送 I
题
如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。
写一条 SQL 查询语句获取即时订单所占的百分比, 保留两位小数。
查询结果如下所示。
解
select
round(
sum(IF(order_date = customer_pref_delivery_date, 1, NULL))
/ COUNT(1)* 100,2)
as immediate_percentage
from
Delivery;
八.1211. 查询结果的质量和占比
题
“位置”(position)列的值为 1 到 500 。
“评分”(rating)列的值为 1 到 5 。评分小于 3 的查询被定义为质量很差的查询。
将查询结果的质量 quality 定义为:
各查询结果的评分与其位置之间比率的平均值。
将劣质查询百分比 poor_query_percentage 为:
评分小于 3 的查询结果占全部查询结果的百分比。
编写一组 SQL 来查找每次查询的名称(query_name)、质量(quality) 和 劣质查询百分比(poor_query_percentage)。
质量(quality) 和劣质查询百分比(poor_query_percentage) 都应四舍五入到小数点后两位。
解
select
q.query_name query_name ,
round(avg(q.rating/q.position),2) quality,
round(sum(if(q.rating<3,1,0))/count(1)*100,2) poor_query_percentage
from
Queries q
group by
q.query_name;