1)相关的表
2)题目
3)帮助理解题目的示例,提供返回结果的格式
有两张不同左右的表,用户表和赛事注册表。然后解题。
1.各种赛事的用户注册百分率
各种赛事的意味着通过contest_id进行分组。
用户注册百分率,我的理解所有用户里面注册这个赛事的百分比,分子其实就是每个赛事参加的用户,也就是分组后的记录数;分母是所有用户数。
或者利用左连接,然后通过avg(case when user_id is not null then +user_id else +0 end)函数算比率。
2.保留2位小数,利用round()。
3.结果按照percentage 降序,相同按照 contest_id,转换成代码就是order by percentage desc,contest_id。
4.加表名
然后我来思考一下,在哪些字段前面加表名。
怀疑case when user_id 要加,变为u.user_id,好吧,测试后+user_id 也要加上u.,就是下面的代码。
Select contest_id,round(avg(case when u.user_id is not null then +u.user_id else +0 end),2)as percentage from users u left join register r on u.user_id=r.user_id group by contest_id order by percentage desc,contest_id;
发现百分率的结果差别,很大,运行结果如下图。
1.计算赛事用户注册百分率出现错误
发现上面的计算方式不对,我不是利用值,是利用记录数。
Count(*)/Count(u.user_id) ,这个结果都是1,但是不是左连接吗?
oh,我找答案算了。下面是我找到的题解。
select contest_id, round(100*count(user_id)/(select count(1) from users),2) as percentage from Register group by contest_id order by 2 desc, 1;
好吧确实是我第一个想法是对的,就是每个赛事参加的用户,也就是分组后的记录数;分母是所有用户数。
分析题解里的count(u.user_id)和count(*):
这里count(1),用count(*)代替也有结果,就是速度不一样。
但是count(u.user_id) 这个是必须的,因为不统计NULL。
2.发现还是出错,他还是设置了一个null的,就是有可能有人什么赛事都没有参加,我又忘记了!!!根本不用左连接就行了,啊啊啊啊啊啊啊啊,而且我才发现我找的都没有连接,下面是我最终通过的答案。
Select contest_id,round(100*count(u.user_id)/(select count(*) from users),2)as percentage from users u join register r on u.user_id=r.user_id group by contest_id order by percentage desc,contest_id;
3.题解与我的不同,所以我也不用连接,而且他的排序用的2,1很有意思,应该就是这张表拍第一的字段和排第二的字段,下面是我修改过后的题解
Select contest_id,round(100*count(user_id)/(select count(*) from users),2)as percentage from register group by contest_id order by percentage desc,contest_id;
1.这种计算百分比的,我发现自己还是比较容易出错的
2.到底是连接没理解对,空值存在的情况还是没考虑好。