解题思路:

分别给出两种情况下会出现的结果,再筛选出所有结果并去重。

1.计算0级用户未完成试卷数与未完成率(保留3位小数)

2.所有有作答记录的用户的未完成试卷数与未完成率(保留3位小数)

3.筛选出所有结果并去重。

步骤:

1.计算0级用户未完成试卷数与未完成率(保留3位小数)

select 
a.uid,
sum(if(score is null and start_time is not null,1,0))  incomplete_cnt1,
round(sum(if(score is null and start_time is not null,1,0)) / count(if(start_time is null,0,1)),3)incomplete_rate1
from user_info a
left join exam_record b
on a.uid=b.uid
where level=0
group by a.uid

2.所有有作答记录的用户的未完成试卷数与未完成率(保留3位小数)

select 
uid,
sum(if(score is null,1,0))  incomplete_cnt2,
sum(if(score is null,1,0)) / count(start_time) incomplete_rate2
from exam_record
group by uid

3.筛选出所有结果并去重。

distinct if((select max(incomplete_cnt1)>2 from t1),t1.uid,t2.uid) uid,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_cnt1,t2.incomplete_cnt2) incomplete_cnt,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_rate1,t2.incomplete_rate2) incomplete_rate

完整代码

with t1 as (
select 
a.uid,
sum(if(score is null and start_time is not null,1,0))  incomplete_cnt1,
round(sum(if(score is null and start_time is not null,1,0)) / count(if(start_time is null,0,1)),3)incomplete_rate1
from user_info a
left join exam_record b
on a.uid=b.uid
where level=0
group by a.uid
),
t2 as (
select 
uid,
sum(if(score is null,1,0))  incomplete_cnt2,
sum(if(score is null,1,0)) / count(start_time) incomplete_rate2
from exam_record
group by uid
)

select 
distinct if((select max(incomplete_cnt1)>2 from t1),t1.uid,t2.uid) uid,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_cnt1,t2.incomplete_cnt2) incomplete_cnt,
if((select max(incomplete_cnt1)>2 from t1),t1.incomplete_rate1,t2.incomplete_rate2) incomplete_rate
from t1,t2
order by incomplete_rate