当前位置: 代码迷 >> Sql Server >> 一条很难的SQL语句
  详细解决方案

一条很难的SQL语句

热度:73   发布时间:2016-04-27 17:59:15.0
一条很难的SQL语句 高手进
我有一个考试表,我的功能是想做出这个表中的错误率统计 
表的结构如下: 

id subjectid(外键,这里指向题库表) content(考试题目内容) isright(是否正确,0错误,1正确) 
1 101 题目内容 0 
2 101 题目内容 0 
3 101 题目内容 1 
4 101 题目内容 1 
5 102 题目内容 0 
6 102 题目内容 1 
7 103 题目内容 0 
8 103 题目内容 1 
9 103 题目内容 1 


我的思路是:先根据 subjectid group by 一下 进行分组,然后得出每个题目错误的个数,还要得出 每个题目出现的总数,(等上例子就是得出101的总数为4 错误的为2个,这样显示结果出来) 
然后排序一下,错的多的排 
在前面,等于就是order by 一下错误的个数 , 小弟想了很久也没写出这个SQL来 感激不尽 


------解决方案--------------------
SQL code
create table tb(id int, subjectid int, content varchar(10) , isright int)insert into tb values(1 , 101 , '题目内容', 0 )insert into tb values(2 , 101 , '题目内容', 0 )insert into tb values(3 , 101 , '题目内容', 1 )insert into tb values(4 , 101 , '题目内容', 1 )insert into tb values(5 , 102 , '题目内容', 0 )insert into tb values(6 , 102 , '题目内容', 1 )insert into tb values(7 , 103 , '题目内容', 0 )insert into tb values(8 , 103 , '题目内容', 1 )insert into tb values(9 , 103 , '题目内容', 1 )goselect subjectid,  错误率 = cast(cast(sum(case isright when 0 then 1 else 0 end ) * 100.0 / (select count(1) from tb where subjectid = t.subjectid) as decimal(18,2)) as varchar) + '%'from tb tgroup by subjectiddrop table tb/*subjectid   错误率                             ----------- ------------------------------- 101         50.00%102         50.00%103         33.33%(所影响的行数为 3 行)*/
------解决方案--------------------
SQL code
 select subjectid,content,count(*) as 题目数量,        sum(case when isright=0 then 1 else 0 end) as 错误数量,         cast(sum(case when isright=0 then 1 else 0 end)/count(*)*100 as char(2))+'%' as 错误率 from tb group by subjectid,content order by sum(case when isright=0 then 1 else 0 end) desc
------解决方案--------------------
SQL code
declare @t table(id int,subjectid int,[content] varchar(10), isright bit)insert @t select 1,101,'题目内容',0insert @t select 2,101,'题目内容',0insert @t select 3,101,'题目内容',1insert @t select 4,101,'题目内容',1insert @t select 5,102,'题目内容',0insert @t select 6,102,'题目内容',1insert @t select 7,103,'题目内容',0insert @t select 8,103,'题目内容',1insert @t select 9,103,'题目内容',1select subjectid,[content],count(1) 题目出现总数,sum(1-isright) 每题出错个数from @tgroup by subjectid,contentorder by subjectidsubjectid   content    题目出现总数      每题出错个数----------- ---------- ----------- -----------101         题目内容       4           2102         题目内容       2           1103         题目内容       3           1(3 行受影响)
------解决方案--------------------
SQL code
create table tb(id int, subjectid int, content varchar(10) , isright int)insert into tb values(1 , 101 , '题目内容', 0 )insert into tb values(2 , 101 , '题目内容', 0 )insert into tb values(3 , 101 , '题目内容', 1 )insert into tb values(4 , 101 , '题目内容', 1 )insert into tb values(5 , 102 , '题目内容', 0 )insert into tb values(6 , 102 , '题目内容', 1 )insert into tb values(7 , 103 , '题目内容', 0 )insert into tb values(8 , 103 , '题目内容', 1 )insert into tb values(9 , 103 , '题目内容', 1 )goselect subjectid,sum(case isright when 0 then 1 else 0 end)'错误数]',count(1) '总题目数',cast(sum(case isright when 0 then 1 else 0 end ) * 100.0 / (select count(1) from tb where subjectid = t.subjectid) as decimal(18,2)) '错误率'from tb t group by subjectid order by subjectid
  相关解决方案