需求:查詢出每一位“社工員”通過23門社工課進度100%的數量和23門社工課對應的考試通過的數量。
業務解析:
1.社工員——針對特定學員的一批人。在表USERS_SW_REGISTER中年份為2017的。
2.課程CourseWare.其中的EXAM_ID表示該門課程對應的考試,且唯一。
社工員的課程是在頻道表JY_Channellesson的頻道Id即Channelid在包括在23內的GetChannelByParentID(23)
另外由於課程重新指定考試,導致一門課程對應有兩場考試。所以要包括之前的兩場考試union select exam_id from chw_exam where exam_id in(55,56)
3.課程進度表USER_COURSE_REG,其中COMPELETE為進度,STATUS表示課程是否下架。
4.課程考試記錄表CHW_EXAM_PREF,其中HIGH_SCORE為考試成績,
5.該門考試的及格分是試卷表CHW_PAPER的試卷總分PAPER_SCORE_VALUE*考試表CHW_EXAM的PASS_SCORE/100
問題:
1. 客戶最后統計的是考試要通過23門的人員名單,所以我們統計的最后只要判斷考過的考試記錄里面每個學員的記錄有23條就通過了。
每人每場考試只有一條記錄,
由於一門課程有兩場考試,所以老考生在考完原來的23門考試之后再考新的試卷會導致超過23場考試記錄。有的老考生會有大於23小於26條的記錄。
不過只要判斷他大於等於23條就算他通過了。
但是有一種情況會有問題:
如果老考生考過了沒有重新指定的課程的所有考試,而且考過了一門課程重新制定的兩場考試,也會顯示考過23門考試。這個情況是不算他通過的。
解決的辦法是如果在查出來的23門課程有一門課程下兩場考試的就減去一門。不過這個在sql中太麻煩了,現在的sql語句已經達到50s了,再這么判斷
估計要1分多鍾了,還有一種方法是,在應用程序中用代碼判斷,應該是挺快的。
select c.user_id,c.USER_NAME,ug.USER_GROUP_NAME,
ISNULL(cp.CourseCount,0)as CourseCount,
ISNULL(pp.PassCount,0)as PassCount
from(
select Top 100 percent a.user_id,b.USER_NAME ,b.USER_GROUP_ID
from dbo.USERS_SW_REGISTER a ,users b
where register_year=2017
and a.user_id=b.USER_ID
)
as c
left join USER_GROUP ug on c.USER_GROUP_ID=ug.USER_GROUP_ID
left join (
-- 取出23門章節測試都通過的學員
select Top 100 percent u.USER_ID,u.USER_NAME,p.USER_GROUP_NAME,b.PassCount
from (
select USER_ID,COUNT(USER_ID) as PassCount
from CHW_EXAM_PREF a
where EXAM_ID in(
--指定社工員考生相應的課程
select exam_id
from COURSEWARE
where COURSE_ID in(
select lessionid
from JY_Channellesson
where Channelid in (
select ID from GetChannelByParentID(23)
)
)
and STATUS=1 and exam_id is not null
union
select exam_id
from chw_exam
where exam_id in(55,56)
)
and CREATE_DATE<='2017-08-20 23:59:59'
and HIGH_SCORE>=
--一門課對應一場考試 取出相應的通過分數
((select pass_score from CHW_EXAM where EXAM_ID=a.EXAM_ID )*
(select PAPER_SCORE_VALUE from CHW_PAPER where PAPER_ID =
(select PAPER_ID from CHW_EXAM_PAPER where EXAM_ID=a.EXAM_ID))/100) --CHW_EXAM_PAPER是考試課程關聯表
group by USER_ID
) as b,USERS u,USER_GROUP p
where
--b.PassCount>=23 and --23門課都通過
b.USER_ID=u.USER_ID --用戶詳細關聯
and p.USER_GROUP_ID=u.USER_GROUP_ID --地區詳細關聯
order by u.USER_GROUP_ID
) as pp on c.user_id=pp.USER_ID
left join
(
select * from (
select USER_ID,COUNT(USER_ID)as CourseCount from USER_COURSE_REG
where COURSE_ID in(
select COURSE_ID
from COURSEWARE
where COURSE_ID in (
select lessionid
from JY_Channellesson
where Channelid in (
select ID from GetChannelByParentID(23)
)
)
and STATUS=1 and exam_id is not null
)
and COMPLETE=100
and IsDeleted=0
group by USER_ID
) as a
--where a.CourseCount>=23
) as cp
on cp.USER_ID=c.user_id
order by c.USER_GROUP_ID