一个SQLServer问题

img


上面的题目我想半天,想不出来,刚接触这个,学校就给我们出这样的题


很基础的查询统计,但描述欠详细不严谨
1. 未给出数据库中表及字段命名。
2. “超过60分”按字面是不包含60分。

若以截图下方表格理解,考核通过条件是:
case when FR得分>60 and SQL得分>60 and TOMAT得分>60
     and FR得分+SQL得分+TOMAT得分+Kettle得分>240 then '考核通过'
     else '考核未通过' end 考核结果

假设截图下方表格名称为Test_Exam
1)查询结果输出人员姓名、考核次数、考核通过次数、考核通过率
select 人员姓名,
count(*) 考核次数,  --这儿“count(*)”可写为sum(1)或者count(1)
sum(case when 考核结果='考核通过' then 1 else 0 end) 考核通过次数,
sum(case when 考核结果='考核通过' then 1 else 0 end)*1.0/count(*) 考核通过率
from Test_Exam
group by 人员姓名

或者
select t.*, 考核通过次数*1.0/考核次数 as 考核通过率
from
(
   select 人员姓名, sum(1) 考核次数,
   sum(case when 考核结果='考核通过' then 1 else 0 end) 考核通过次数
   from Test_Exam
   group by 人员姓名
) t
--说明:当“/”表示整除时,用“*1.0”相当于转换float,如“cast(考核通过次数 as float)”


--总体考核次数、考核通过次数、考核通过率
select 总考核次数,总考核通过次数,
总考核通过次数*1.0/总考核次数 as 总考核通过率
from
(
   select sum(1) 总考核次数,
   sum(case when 考核结果='考核通过' then 1 else 0 end) 总考核通过次数
   from Test_Exam
) t

2)查询多次考核总分的平均分>=250的人员姓名、考核平均分
--这个的“多次”若指为某个人参加考试>=2次,为何不描述“2次或以上”?

   select 人员姓名, sum(FR得分+SQL得分+TOMAT得分+Kettle得分)/sum(1) 考核平均分
   --sum(1) as 考核次数,
   --sum(FR得分+SQL得分+TOMAT得分+Kettle得分) as 总分
   from Test_Exam
   group by 人员姓名
   having sum(1)>1  --2次或以上
   and sum(FR得分+SQL得分+TOMAT得分+Kettle得分)/sum(1)>=250

--平均分采用整除

或者
select 人员姓名, --考核次数, --题中没要求显示考核次数
总分/考核次数 as 考核平均分
from
(
   select 人员姓名, sum(1) as 考核次数,
   sum(FR得分+SQL得分+TOMAT得分+Kettle得分) as 总分
   from Test_Exam
   group by 人员姓名
) t
where 考核次数>1 and 总分/考核次数>=250

3)若通过一次考核视为人员考核通过,若考核通过则输出考核通过中总分最高的记录;若考核未通过则输出考核未通过中总分最高的记录,结果输出:人员姓名、考核结果、FR得分、SQL得分、TOMCAT得分、kettle得分、考核时间
--若同一人多次考试有多条相同的“总分最高”是不是也显示?
--输出结果有分项得分,却不显示总分?实际应用一般有合计项

假设:
(1)可能存在“考核未通过的总分”大于或等于“考核通过的总分”的记录。
(2)可能同一个考核通过人员有“通过”和“未通过”两种记录。
(3)按人员分组查询,而不是只查总体那条“总分最高的记录”。

查询方法多种多样,其中之一如下:
select * from Test_Exam as T1
where exists 
(
   --考核通过中总分最高的记录
   select 1 from
   (
      select 人员姓名, 考核结果, --sum(1) as 考核次数,
      sum(case when 考核结果='考核通过' then 1 else 0 end) 考核通过次数,
      sum(case when 考核结果='考核未通过' then 1 else 0 end) 考核未通过次数,
      max(FR得分+SQL得分+TOMAT得分+Kettle得分) 最高总分
      from Test_Exam
      group by 人员姓名, 考核结果
   ) as T2
   where T1.人员姓名=T2.人员姓名
   and T1.考核结果=T2.考核结果
   and 
   (
     (T2.考核通过次数>=1 and T2.考核结果='考核通过') 
     or T2.考核通过次数=0 --(T2.考核通过次数=0 and T2.考核结果='考核未通过')
   )
   and T1.FR得分+T1.SQL得分+T1.TOMAT得分+T1.Kettle得分=T2.最高总分
)