SQL题:某外卖平台有users(用户表),restaurants(餐厅表),orders(订单表)

一、进行表的创建

-- 用户表
create table if not exists users (
	user_id int,
    user_name string,
    password string,
    email string,
    phone_number string,
    address string
)
row format delimited
fields terminated by ',';

-- 餐厅表
create table if not exists restaurants (
    restaurant_id int,
    restaurant_name string,
    restaurant_address string,
    restaurant_phonenumber string,
    cuisine_type string
)
row format delimited
fields terminated by ',';

-- 订单表
create table if not exists orders (
    order_id int,
    user_id int,
    restaurant_id int,
    order_date string,
    total_amount string,
    order_status string
)
row format delimited
fields terminated by ',';

二、对需求进行解答

1. 查询五一期间(2023-05-01 ~ 2023-05-07),每个餐厅的订单总数量及排名

with t as (
    -- 五一期间每一个餐厅的订单总数
    select restaurant_id,count(1) totalNum  from orders
         where order_date >='2023-05-01 00:00:00' and order_date <='2023-05-07 23:59:59'
         group by restaurant_id
)
select *,dense_rank() over (order by totalNum desc) from t ;

2. 查看最近一个月内在一家餐厅重复购买 3 次以上的餐厅名字、用户名字、购买次数

with t as (
    select r.restaurant_name,u.user_name,o.order_id from orders o , restaurants r ,users u
     where o.restaurant_id = r.restaurant_id and o.user_id = u.user_id
     and substr(o.order_date,1,10) >= add_months(`current_date`(),-1)
)
select t.restaurant_name,t.user_name,count(1) orderNum from t group by t.restaurant_name,t.user_name having orderNum >=3;

3. 查看订单最多的用户ID、用户名(包含并列第一的情况)

-- 3. 查看订单最多的用户ID、用户名(包含并列第一的情况)

with t as (
    select u.user_id,u.user_name,count(1) ordernum from
        orders o join users u on o.user_id = u.user_id
    group by u.user_id,u.user_name
),t2 as (
    select *,dense_rank() over (order by ordernum desc) pm from t
)
select * from t2 where pm = 1;

 4. 查询至少被三个不同用户消费过的餐厅

select restaurant_id,count(distinct user_id) userNum from orders group by restaurant_id
  having userNum>=3;

5. 查询在五一期间,每个用户消费的餐厅前三名(按照消费的金额计算)


select substr(order_date,6,5) from orders limit 1;
with t as (
   select user_id,restaurant_id,sum(total_amount) orderMoney from orders where substr(order_date,6,5) >='05-01' and substr(order_date,6,5) <='05-07'
                     group by user_id,restaurant_id
),t2 as (
    select *,dense_rank() over (partition by user_id order by orderMoney desc) pm from t
)
select * from t2 where pm <=3;

6. 查询每一个用户在最近一个月内的订单量,以及上一个月的订单量

select
    user_id,
     count(case when substr(order_date,1,10) between add_months(`current_date`(),-1)  and `current_date`() then 1 else null end ) `最近一个月订单数`,
     count(case when substr(order_date,1,10) between add_months(`current_date`(),-2)  and date_sub(add_months(`current_date`(),-1),1) then 1 else null end ) `上个月订单数`

   from orders group by user_id ;

7. 查询每一个餐厅当月订单数量、上月订单数量、订单数量环比增长率,按照环比增长率降序排列

环比增长率:(当月订单数量 - 上月订单数量)/ 上月订单数量

with t as (
    select restaurant_id,
       count(case when substr(order_date,1,10) between add_months(`current_date`(),-1)  and `current_date`() then 1 else null end ) dydds,
       count(case when substr(order_date,1,10) between add_months(`current_date`(),-2)  and date_sub(add_months(`current_date`(),-1),1) then 1 else null end ) sydds
       from orders group by restaurant_id
)
select restaurant_id,(dydds-sydds)/sydds zzlv from t order by zzlv desc ;

8. 查询每个用户的订单金额排名,显示排名前三的用户及其订单金额


with t as (
    select user_id,sum(total_amount) totalMoney from orders group by user_id
),t2 as (
    select *,dense_rank() over (order by totalMoney desc) pm from t
)
select *,u.user_name from t2,users u where t2.user_id=u.user_id and pm <= 3;

9. 查询每一个顾客的总下单数量和总消费金额

select user_id,count(1),sum(total_amount) from orders group by user_id;

10. 查询五一期间,消费总金额高于平均值的用户

select avg(total_amount) from orders where substr(order_date,6,5) >='05-01' and substr(order_date,6,5) <='05-07';

select user_id,sum(total_amount) totalMoney from orders
     where substr(order_date,6,5) >='05-01' and substr(order_date,6,5) <='05-07' group by user_id
     having sum(total_amount) >(select avg(total_amount) from orders where substr(order_date,6,5) >='05-01' and substr(order_date,6,5) <='05-07');

11. 查询最后一个订单距离现在时间超过 5 天的用户,以及天数


select user_id,max(order_date),datediff(`current_date`(),max(order_date)) days from orders group by user_id having max(user_id) < date_sub(`current_date`(),5);

12. 查询具有最多订单的餐厅所在城市的名称和订单数量


with t as (
    select r.restaurant_name,r.restaurant_address,count(1) orderNum from orders o join restaurants r on o.restaurant_id = r.restaurant_id
     group by r.restaurant_name,r.restaurant_address
),t2 as (
    select *,dense_rank() over ( order by orderNum desc) pm from t
)
select * from t2 where pm = 1;

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不能提供特定项目的代码或数据库。但是,我可以帮助您了解如何创建一个外卖项目的基本数据库结构,以供参考。 一个基本的外卖项目可能包括以下几个主要格: 1. 用户users):存储用户的个人信息,如用户ID、用户名、密码、手机号码、地址等。 ```sql CREATE TABLE users ( user_id INT PRIMARY KEY, username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, phone_number VARCHAR(20), address VARCHAR(255) ); ``` 2. 商家restaurants):存储商家的信息,如商家ID、商家名称、地址等。 ```sql CREATE TABLE restaurants ( restaurant_id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, address VARCHAR(255) ); ``` 3. 菜品(dishes):存储不同菜品的信息,如菜品ID、菜品名称、价格等。 ```sql CREATE TABLE dishes ( dish_id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) NOT NULL, restaurant_id INT, FOREIGN KEY (restaurant_id) REFERENCES restaurants (restaurant_id) ); ``` 4. 订单orders):存储用户下的订单信息,如订单ID、用户ID、商家ID、订单状态等。 ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, restaurant_id INT, status VARCHAR(50), FOREIGN KEY (user_id) REFERENCES users (user_id), FOREIGN KEY (restaurant_id) REFERENCES restaurants (restaurant_id) ); ``` 5. 订单详情order_details):存储每个订单中菜品的详细信息,如订单详情ID、订单ID、菜品ID、数量等。 ```sql CREATE TABLE order_details ( detail_id INT PRIMARY KEY, order_id INT, dish_id INT, quantity INT, FOREIGN KEY (order_id) REFERENCES orders (order_id), FOREIGN KEY (dish_id) REFERENCES dishes (dish_id) ); ``` 以上只是一个简单的外卖项目数据库结构示例,实际的项目可能会更加复杂。您可以根据您的具体需求进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值