SQL | 多表连接 | 用户满意度/非禁止用户的取消率

一、用户满意度

satisfaction表记录了教师和学生对课程的满意程度。
satisfaction列里是老师和学生对课程的评价,其中“是”表示教师和学生都满意。

satisfaction表:
	teacher_id:老师编号
	student_id:学生编号
	satisfaction:是否满意

user表记录了学校教师和学生的信息。

 user表:
	 id:编号,主键,包括老师和学生的编号
	 insystem:是否在系统
	 role:角色

两个表的关系:satisfaction表的student_id 、teacher_id和user表的 id 联结。
分析出学校里人员对课程的满意度。满意度的计算方式如下:
(教师和学生对课程都满意且已存在当前教务系统中的用户) / (在学校里的人数)
1、创建表

CREATE TABLE IF NOT EXISTS user(
id VARCHAR(10) PRIMARY KEY,
insystem VARCHAR(10),
role VARCHAR(50)
);

CREATE TABLE IF NOT EXISTS satisfaction(
teacher_id VARCHAR(10),
student_id VARCHAR(10),
satisfaction VARCHAR(50),
CONSTRAINT FOREIGN KEY(teacher_id) REFERENCES user(id),
CONSTRAINT FOREIGN KEY(student_id) REFERENCES user(id)
);

2、插入数据

INSERT INTO user VALUES('1','是','学生'),
					   ('2','是','学生'),
					   ('3','否','学生'),
					   ('01','是','老师'),
					   ('02','是','老师'),
					   ('03','是','老师');

INSERT INTO satisfaction VALUES('01','1','是'),
							   ('01','2','学生不满意'),
							   ('01','3','是'),
							   ('02','1','老师不满意'),
							   ('02','2','是'),
							   ('02','3','是'),
							   ('03','1','学生不满意'),
							   ('03','2','是'),
							   ('03','3','是');

3、逻辑SQL
(1)多表连接
satisfaction表的student_id 、teacher_id和user表的 id 联结,需与user表连接两次

mysql> SELECT * FROM satisfaction s LEFT JOIN user u1 ON s.teacher_id=u1.id
    -> LEFT JOIN user u2 ON s.student_id=u2.id;
+------------+------------+-------------+------+----------+--------+------+----------+--------+
| teacher_id | student_id | satisfaction| id   | insystem | role   | id   | insystem | role   |
+------------+------------+-------------+------+----------+--------+------+----------+--------+
| 01         | 1          || 01   || 老师   | 1    || 学生   |
| 01         | 2          | 学生不满意   | 01   || 老师   | 2    || 学生   |
| 01         | 3          || 01   || 老师   | 3    || 学生   |
| 02         | 1          | 老师不满意   | 02   || 老师   | 1    || 学生   |
| 02         | 2          || 02   || 老师   | 2    || 学生   |
| 02         | 3          || 02   || 老师   | 3    || 学生   |
| 03         | 1          | 学生不满意   | 03   || 老师   | 1    || 学生   |
| 03         | 2          || 03   || 老师   | 2    || 学生   |
| 03         | 3          || 03   || 老师   | 3    || 学生   |
+------------+------------+-------------+------+----------+--------+------+----------+--------+
9 rows in set (0.00 sec)

(2)筛选出在系统内的用户,且均为满意

mysql> SELECT * FROM satisfaction s LEFT JOIN user u1 ON s.teacher_id=u1.id
    -> LEFT JOIN user u2 ON s.student_id=u2.id
    -> WHERE satisfaction='是' AND u1.insystem='是' AND u2.insystem='是';
+------------+------------+--------------+------+----------+--------+------+----------+--------+
| teacher_id | student_id | satisfaction | id   | insystem | role   | id   | insystem | role   |
+------------+------------+--------------+------+----------+--------+------+----------+--------+
| 01         | 1          || 01   || 老师   | 1    || 学生   |
| 02         | 2          || 02   || 老师   | 2    || 学生   |
| 03         | 2          || 03   || 老师   | 2    || 学生   |
+------------+------------+--------------+------+----------+--------+------+----------+--------+
3 rows in set (0.00 sec)

(3)满意度计算
(教师和学生对课程都满意且已存在当前教务系统中的用户) / (在学校里的人数)
课程都满意且已存在当前教务系统中的用户需COUNT老师和学生相加的总人数
学校的里的人数COUNT总用户数
ROUND()、CONCAT()转为为百分比

mysql> SELECT CONCAT(ROUND((COUNT(DISTINCT teacher_id)+COUNT(DISTINCT student_id))/(SELECT COUNT(id) FROM user),2)*100,'%') AS '满意度'
    -> FROM satisfaction s LEFT JOIN user u1 ON s.teacher_id=u1.id
    -> LEFT JOIN user u2 ON s.student_id=u2.id
    -> WHERE satisfaction='是' AND u1.insystem='是' AND u2.insystem='是';
+-----------+
| 满意度    |
+-----------+
| 83.00%    |
+-----------+
1 row in set (0.02 sec)
二、非禁止用户的取消率

下表是一家出行公司(比如滴滴、Uber)的数据库表。乘客通过该公司的app叫车,司机通过app接收订单。

Users 表:存放的是用户信息。
	Users_Id 每个用户有唯一值 。
	Banned 表示用户是否因为违规被禁止使用app。
	Role 记录了用户的角色,里面的值driver是司机,client是乘客,partner是合伙人。

Trips 表:记录了各个出租车的行程信息。
	Id:每段行程有唯一键(Id) 。
	Client_Id 乘客id
	Driver_Id 司机id
	City_Id 城市id
	Status 行程类型  ‘completed’表行程正常结束, 
					‘cancelled_by_driver’ 表示行程因为司机原因取消,
					‘cancelled_by_client’表示行程因为乘客原因取消。
	Request_at 时间

查出非禁止用户的取消率。
取消率的计算方式如下:
(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)
(1)创建表

CREATE TABLE IF NOT EXISTS Users(
Users_Id VARCHAR(255) PRIMARY KEY,
Banned VARCHAR(255),
Role VARCHAR(255)
);

CREATE TABLE IF NOT EXISTS Trips (
Id INT,
Client_Id VARCHAR(255),
Driver_Id VARCHAR(255),
City_Id INT,
Status VARCHAR(255),
Request_at DATE,
CONSTRAINT FOREIGN KEY(Client_Id) REFERENCES Users(Users_Id),
CONSTRAINT FOREIGN KEY(Driver_Id) REFERENCES Users(Users_Id)
);

(2)插入数据

INSERT INTO Users VALUES('1','NO','client'),
						('2','NO','client'),
						('3','NO','client'),
						('4','NO','client'),
						('11','NO','driver'),
						('12','NO','driver'),
						('13','NO','driver'),
						('14','NO','driver');

INSERT INTO Trips VALUES(1,'1','11',1,'completed','2021-3-1'),
						(2,'2','12',1,'cancelled_by_driver','2021-3-1'),
						(3,'3','13',6,'completed','2021-3-1'),
						(4,'4','14',6,'cancelled_by_client','2021-3-1'),
						(5,'1','11',1,'completed','2021-3-2'),
						(6,'2','12',6,'completed','2021-3-2'),
						(7,'3','13',6,'completed','2021-3-2'),
						(8,'2','13',12,'completed','2021-3-3'),
						(9,'3','11',12,'completed','2021-3-3'),
						(10,'4','14',12,'cancelled_by_driver','2021-3-3');

(3)逻辑SQL
COUNT(CASE WHEN t.Status=‘completed’ THEN null ELSE ‘取消’ END)

SUM(IF(t.Status=‘completed’,0,1))

mysql> SELECT t.Request_at,CONCAT(ROUND(COUNT(CASE WHEN t.Status='completed' THEN null ELSE '取消' END)/COUNT(1),2)*100,'%') AS '取消率'
    -> FROM Trips t LEFT JOIN Users u1 ON t.Client_Id=u1.Users_Id
    -> LEFT JOIN Users u2 ON t.Driver_Id=u2.Users_Id
    -> WHERE u1.Banned='No' AND u2.Banned='No'
    -> GROUP BY t.Request_at;
+------------+-----------+
| Request_at | 取消率    |
+------------+-----------+
| 2021-03-01 | 50.00%    |
| 2021-03-02 | 0.00%     |
| 2021-03-03 | 33.00%    |
+------------+-----------+
3 rows in set (0.00 sec)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值