1. 程式人生 > >sql sever中計算百分比

sql sever中計算百分比

初步使用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()函式會丟失精度。