【学习笔记】数据库ORACLE实练(2)decode函数

现有两表:
① Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
表头为——| Id | Client_Id | Driver_Id | City_Id | Status |Request_at|
② Users 表存所有用户。每个用户有唯一键 Users_Id。Banned 表示这个用户是否被禁止,Role 则是一个表示(‘client’, ‘driver’, ‘partner’)的枚举类型。
表头为——| Users_Id | Banned | Role |

题目:写一段 SQL 语句查出 2013年10月1日 至 2013年10月3日期间非禁止用户的取消率。取消率(Cancellation Rate)保留两位小数。

ps.取消率的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)

题目来源:力扣(LeetCode)
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

贴出大佬的答案如下:

select 
a.request_at Day,
round(sum(decode(a.status,'completed',0,1))/count(1),2) 
"Cancellation Rate" 
from Trips a

left join Users b
on (a.client_id = b.users_id and b.role = 'client')

left join Users c
on (a.driver_id = c.users_id and c.role = 'driver')

where (b.banned <> 'Yes' and c.banned <> 'Yes' 
and a.request_at between '2013-10-01' and '2013-10-03')
group by a.request_at

作者:YijiangYao
链接:https://leetcode-cn.com/problems/trips-and-users/solution/oracleliang-ci-left-joinzai-group-by-by-yijiangyao/
来源:力扣(LeetCode)

通过两次左连接,实现了client和driver两种不同身份与user表的连接需求,从而确保两种身份的user都未被ban。而巧妙运用decode()函数更是简化了计算取消率时的转换问题,将字符直接替换为0和1,这种运用方法值得借鉴ヾ(◍°∇°◍)ノ゙。
¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

知识点:ORACLE自带的decode()函数

函数公式定义——decode(作用域,若为值1,则变为值a,若为值2,则变为值b,……,若为值nnn,则变为值xxx,缺省值mmm)

它类似于编程语言中的case()函数,在作用域中遇见不同的值,会进行不同的操作;只不过在oracle中,操作被局限为值替换这一招。例如:将student表中grades这一属性列中的小写字母a,b,c替换为大写A,B,C,其他字母一律替换为F。那么可这样使用该函数:*decode(student.grades , a , A , b , B , c , C , F)*即可。

最常见的应该就是相同数据类型不同值的替换,但本题中,大佬运用了字符与数字的替换,巧妙实现了比率的求解,值得借鉴!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值