力扣sql练习:即时食物配送 II

50 阅读2分钟

题目:即时食物配送 II

题目要求:

如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。

「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。

写一条 SQL 查询语句获取即时订单在所有用户的首次订单中的比例。保留两位小数。

即时食物配送 II.png

使用到的技术& 方法

  1. case when then else
  2. sum
  3. min
  4. in
  5. group by
  6. round

思路:

  1. 目的:求出首次订单中及时订单所占的比例

  2. 筛选时间,通过min求出用户customer_id 下单最早的时间,需要 通过分组进行查找 (表1)

    select customer_id ,min(order_date ) from Delivery group by customer_id

  3. 找到之后,遍历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 )

  4. 如果存在,那么,查找出来的结果肯定首次订单,那么就通过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函数中还可以嵌套其他函数来进行更复杂的计算。

优点:灵活性高,普适性强,不受数据类型和数据表结构限制。