需求:查询出每一位“社工员”通过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. 异步任务--celery发送邮件

    安装两个python包: pip install celery==3.1.25 pip install django-celery==3.1.17 在配置文件settings.py中做如下配置: a) ...

  2. Java运行时内存划分与垃圾回收--以及类加载机制基础

    ----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...

  3. Element ui表格展示多张图片问题

    显示一张图片的方法: <el-table-column label="头像" width="100"> <template scope=&qu ...

  4. webpack学习(一)

    1.首先建立一个webpack项目,然后新建文件demo2,在demo2下新建src文件,index.html文件,初始化项目 (npm init --yes)得到package.json 2.全局安 ...

  5. Oil Deposits

    Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...

  6. Toxophily

    Problem Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and ...

  7. JavaScript 语言精粹读书笔记

    最近在看 赵泽欣 / 鄢学鹍 翻译的 蝴蝶书, 把一些读后感言记录在这里. 主要是把作者的建议跟 ES5/ES5.1/ES6 新添加的功能进行了对比 涉及到的一些定义 IIFE: Immediatel ...

  8. HTML中动态生成内容的事件绑定问题【转载】

    转自 http://www.hitoy.org/event-binding-problem-of-dynamically-generated-content.html 由于实际的需要,有时需要往网页中 ...

  9. jQuery选择器(内容过滤选择器)第四节

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. Python 解决面试题47 不用加减乘除做加法

    在看<剑指Offer>过程中,面试题47不用加减乘除做加法,给出的思路是使用二进制的异或以及与运算,总之就是使用二进制.但是在使用Python实现的过程中,对于正整数是没有问题的,但是对于 ...