初步使用sql server计算取出的数据的百分比:
已有条件数据表1张:dati_record 表。其中包含tm_id(每个题目的ID),right_anser(正确答案),mem_anser(用户给出的答案)
思路:①首先取出每道题有多少人答过(构成答题次数,被除数)
②然后取出每道题有多少人答对过(构成除数)
③结合答题情况表和回答正确表,联合两张表,获取需要的tm_id、答题次数以及回答正确次数
④使用除法,来获取正确率
-----每道题的答题情况
select tm_id,count(1) as '答题次数'
from dati_record group by tm_id order by '答题次数' desc
-----每道题回答正确情况
select tm_id,count(1) as '正确次数' from dati_record
where right_answer = mem_answer group by tm_id order by '正确次数' desc
//方法一
------- CONVERT(decimal(18, 2),除数 * 1.0 / 被除数) * 100) 取的商结果是四舍五入的,并且小数部分都是零
select a.tm_id,b.正确次数,a.答题次数, CAST((CONVERT(decimal(18, 2),b.正确次数 * 1.0 / a.答题次数) * 100) as varchar(50)) +'%' as '正确率'
from ( (select tm_id,count(1) as '答题次数' from dati_record group by tm_id) a inner join (select tm_id,count(1) as '正确次数' from dati_record where right_answer = mem_answer group by tm_id) b on a.tm_id = b.tm_id )
order by '正确率'
//方法二
---- CAST(CAST(除数*1.0*100/被除数 as decimal(10,2)) as varchar(50)) +'%' 得到的是有零有整的小数,不会对结果进行四舍五入
select a.tm_id,b.正确次数,a.答题次数, CAST(CAST(b.正确次数*1.0*100/a.答题次数 as decimal(10,2)) as varchar(50)) +'%' as '正确率'
from ( (select tm_id,count(1) as '答题次数' from game_jili_tsg_record group by tm_id) a inner join (select tm_id,count(1) as '正确次数' from game_jili_tsg_record where right_answer = mem_answer group by tm_id) b on a.tm_id = b.tm_id )
order by '正确率'
关于decimal(a,b)函数
decimal(a,b)
参数a 用于指定小数点左边和右边可以存储的十进制数字的最大个数,目前最大精度为38。
参数b 用于指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。
本次情况,可以学到sql中的CAST()函数,可以参考这位的博客学习该函数,写得很有条理
关于CONVERT()函数,我目前接触的都是 使用convert()函数来转换日期格式和字符类型。
本次实践中,了解了CONVERT()函数的新用法。
接下来会进一步了解一下两个转换类型函数的区别以及了解为什么有时候使用decimal()函数会丢失精度。