需求:查询出每一位“社工员”通过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

sql执行时间过长,请高手指点!的更多相关文章

  1. MySQL 的性能(上篇)—— SQL 执行时间分析

    简介 文中内容均为阅读前辈的文章所整理而来,参考文章已在最后全指明 本文分为上下两篇: 上篇:MySQL 的 SQL 执行时间分析 下篇:MySQL 性能优化 后端开发必然会接触到数据库,数据层的优劣 ...

  2. Dbgrid控件多重选择的怪问题。BookMarkList,BookMark,使用书签,用的ADOQuery控件。100分送上,急阿!!!请高手帮忙!

    Dbgrid控件多重选择的怪问题.BookMarkList,BookMark,使用书签,用的ADOQuery控件.100分送上,急阿!!!请高手帮忙! ( 积分: 100 )<br />p ...

  3. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  4. php: 不能嵌套try-catch-fnally,否则执行时间过长

    php不能try-catch-fnally里面在嵌套try-catch-fnall,否则本来执行时间不长的程序,会被执行更长时间,这是php的bug吗? 如: try{ 代码块 }catch (\Ex ...

  5. 【转】drupal7请求异常,执行时间过长的解决方法

    drupal7请求错误,执行时间过长的解决办法 根据你的系统或网络设置Drupal不能读取网页,造成功能缺失.可能是web服务器配置或PHP设置引起的,可用更新.获取更新源.使用OpenID登 录或使 ...

  6. 如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;)。

    1.如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;). 2.select查询的多个字段之间要用逗号“,”分割,如果查询涉及多个表,那多个表之 ...

  7. 【云盘资料】Sql注入从菜鸟到高手系列教程

    [云盘资料]Sql注入从菜鸟到高手系列教程 ps:Sql注入从菜鸟到高手系列教程 链接:阅读原文获取资料:http://bbs.ichunqiu.com/thread-6851-1-1.html 反馈 ...

  8. drupal7请求异常,执行时间过长的解决方法

    drupal7请求错误,执行时间过长的解决办法 根据你的系统或网络设置Drupal不能读取网页,造成功能缺失.可能是web服务器配置或PHP设置引起的,可用更新.获取更新源.使用OpenID登 录或使 ...

  9. Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名

    Oracle数据库,用mybatic批量插入数据: <insert id="saveBatch" parameterType="io.renren.entity.N ...

随机推荐

  1. JS的基本类型(小知识)

    一:js中的基本类型: 基本类型:boolen, string ,number,null,undefined 引用类型:object,和函数 二.undedifned和null的区别: 1 undef ...

  2. php+Mysql页面注册代码

    页面设置代码:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF- ...

  3. C++输入输出cin与cout

    输入对象 istream:cin(标准输入) 输出对象 ostream: cout(标准输出), cerr(标准错误),clog(输出程序运行时的一般性信息)

  4. PyQt中对RadioButton分组

    我们知道在同一widget组件中的radio button有排他属性,为了在一个窗口中显示多组radio button,我们需要对其分组. 通常有两种选择,一种是BoxGroup,另一种是Button ...

  5. Pseudoforest(伪最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...

  6. Just a Hook(区间set)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. iOS 中的 Delayed Transition

    Android 的动画体系中,存在一类由 TransitionManager. beginDelayedTransition 管理的动画.这个方法,很特殊.执行此方法后,其后续的 UI 变化,不会立即 ...

  8. mac下安装HTMLTestRunner

    HTMLTestRunner是Python标准库unittest模块的一个扩展.它生成易于使用的HTML测试报告. 1.下载HTMLTestRunner.py模块地址 http://tungwaiyi ...

  9. C#操作Excel知识点

    近期在使用C#操作excel,主要是读取excel模板,复制其中的模板sheet页,生成多个sheet页填充相应数据后另存到excel文件,所用到的知识点如下. 一.添加引用和命名空间 添加Micro ...

  10. 基于 Aspose.Cells与XML导入excel 数据----操作类封装

    前言 导入excel数据, 在每个项目中基本上都会遇到,第三方插件或者基于微软office,用的最多的就是npoi,aspose.cells和c#基于office这三种方式,其中各有各的优缺点,在这也 ...