题目:即时食物配送 II
题目要求:
如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。
「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。
写一条 SQL 查询语句获取即时订单在所有用户的首次订单中的比例。保留两位小数。
使用到的技术& 方法
- case when then else
- sum
- min
- in
- group by
- round
思路:
-
目的:求出首次订单中及时订单所占的比例
-
筛选时间,通过min求出用户customer_id 下单最早的时间,需要 通过分组进行查找 (表1)
select customer_id ,min(order_date ) from Delivery group by customer_id
-
找到之后,遍历Delivery 表,判断用户 customer_id 以及配送时间 customer_pref_delivery_date 是否在 表1 中,通过in方法
select * from Delivery where (customer_id , customer_pref_delivery_date ) in (select customer_id ,min(order_date ) from Delivery group by customer_id )
-
如果存在,那么,查找出来的结果肯定首次订单,那么就通过case when then else 、sum round 函数,筛选出及时订单,然后求百分比即可
select round( 100*sum( case when order_date = customer_pref_delivery_date )/sum(1),2) immediate_percentage from Delivery where (customer_id , customer_pref_delivery_date ) in (select customer_id ,min(order_date ) from Delivery group by customer_id )
sql:
select round(100*sum(case when order_date = customer_pref_delivery_date
then 1 else
0 end )/sum(1),2) immediate_percentage
from Delivery where ( customer_id ,order_date) in (select customer_id
,min(order_date) mindate from Delivery group by customer_id )
答疑解惑
sum(1) 是什么:相当于count(*) 不是说判断等于1的和,而且这个表单的总条数
关于CASEWHENSUM
CASE WHEN SUM:是典型的SQL函数之一,它可以把所有符合条件的记录的某个字段值进行累加,最后得到一个总和,该总和值仅包含符合条件的字段值。注意后面判断 then 和else 之后要加一个end 表示结束
CASE WHEN SUM函数常用于SELECT语句中,用于筛选记录并进行计算。它通过判断条件是否成立,来对相应的字段值进行求和。如果不满足条件,则对应的字段值不参与总和的计算。具体使用方法如下:
首先,我们需要为每个需要计算的条件指定一个别名,例如‘已发货订单数量’和‘已发货总金额’;其次,分别使用CASE WHEN SUM函数查询ORDER_NUM和ORDER_AMOUNT字段,对符合条件的销售记录进行求和,得到已发货的订单数量和总金额。
上述示例使用了‘THEN value ELSE 0’语法,意味着只有符合条件的记录才会参与总和的计算,没符合条件的记录视为0。如需将所有记录的值累加,不受条件的限制,则可以省略ELSE语句。另外,CASE WHEN SUM函数中还可以嵌套其他函数来进行更复杂的计算。
优点:灵活性高,普适性强,不受数据类型和数据表结构限制。