需求:查询出每一位“社工员”通过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. VB 用代码创建的控件和接收事件

    在声明公共变量的位置加上这句就可以了 Dim WithEvents NewButton As Button form_load中添加 NewButton = New Button        New ...

  2. 关于session共享的解决方法

    当网站业务规模和访问量的逐步增大,原本由单台服务器.单个域名组成的网站架构可能已经无法满足发展需要 此时会购买更多的服务器,并且以频道化的方式启用多个二级子域名,然后根据业务功能将网站分别部署在独立的 ...

  3. js 两个日期比较相差多少天

    var day1 = new Date("2017-9-17"); var day2 = new Date("2017-10-18"); console.log ...

  4. centos6.5配置uwsgi与nginx支持django

    一.centos中升级python 1. > wget https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz # https://ww ...

  5. The Worm Turns

    The Worm Turns Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. 【每天半小时学框架】——React.js的模板语法与组件概念

           [重点提前说:组件化与虚拟DOM是React.js的核心理念!]        先抛出一个论题:在React.js中,JSX语法提倡将 HTML 和 CSS 全都写入到JavaScrip ...

  7. jumpserver安装详解

    环境说明 主机为最小 安装的centos6.9 x86_64. [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [ro ...

  8. scrolling 优化 避免卡顿

    让我们来瞧瞧在滚动时到底发生了什么.在理解这个问题之前,我们先简要的介绍下浏览器是如何向屏幕绘制内容的.这一切都是从 DOM 树(本质上就是页面中的所有元素)开始的.浏览器先检查拥有了样式的 DOM, ...

  9. ①bootstrap引入

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. HTML学习笔记 css定位浮动及瀑布流案例 第十三节 (原创) 参考使用表

    #fd { width: 100px; height: 150px; background-color: forestgreen; float: left; } #sd { width: 150px; ...