配送表: Delivery
delivery_id 是表的主键。 该表保存着顾客的食物配送信息,顾客在某个日期下了订单,并指定了一个期望的配送日期(和下单日期相同或者在那之后)。 如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。 写一条 SQL 查询语句获取即时订单所占的百分比, 保留两位小数。 查询结果如下所示:
+-------------+-------------+------------+-----------------------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date |
+-------------+-------------+------------+-----------------------------+
| 1 | 1 | 2019-08-01 | 2019-08-02 |
| 2 | 5 | 2019-08-02 | 2019-08-02 |
| 3 | 1 | 2019-08-11 | 2019-08-11 |
| 4 | 3 | 2019-08-24 | 2019-08-26 |
| 5 | 4 | 2019-08-21 | 2019-08-22 |
| 6 | 2 | 2019-08-11 | 2019-08-13 |
+-------------+-------------+------------+-----------------------------+
解题思路
题目要求获取即时订单所占的比例,最直观的思路就是计算出即时订单的数量,再计算出总订单的数量。即时订单数量除以总订单数据就是我们要求的比例。
解题答案
解法一:
select round (
(select count(*) from Delivery where order_date = customer_pref_delivery_date) /
(select count(*) from Delivery) * 100,
2
) as immediate_percentage
解法二:
select round (
sum(case when order_date = customer_pref_delivery_date then 1 else 0 end) /
count(*) * 100,
2
) as immediate_percentage
from Delivery
解法三:
select round (
sum(order_date = customer_pref_delivery_date) /
count(*) * 100,
2
) as immediate_percentage
from Delivery
答题总结
第一种思路是一种常规思路。重要的是sum()函数中的参数理解。常规的sum()函数我们都是直接写某个列明。实则sum()函数的参数是一个表达式,根据表达式来统计每一行的返回值。
比如订单表中有10条数据,我们用sum(money)计算总订单价格。实则这里的sum()是根据行数一行一行的累计相加的。因此这里的sum()可以是一个表达式。