需求:查询出每一位“社工员”通过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. 符合语言习惯的Python优雅编程技巧

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀 ...

  2. switchhost -- 切换host的工具

    https://github.com/oldj/SwitchHosts/downloads 下载链接: 1,290 downloads SwitchHosts! _v0.2.2.1790.dmg - ...

  3. 关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态

    关于火狐浏览器在开发调试过程中,出现javascript:void(0)的状态 由于火狐浏览器没有安装 Adobe Flash Player 19 NPAPI这个插件 安装好了之后就可以直接运行了

  4. Nodejs MSSQL详细解读

    MSSQL 是Nodejs用于连接Microsoft SQL Server 的插件. 安装方法 npm install mssql 配置Config const config = { user: '. ...

  5. Leetcode题解(四)

    12/13.Integer to Roman/Roman to Integer 题目 罗马数字规则: 符号 I V X L C D M 数字 1 5 10 50 100 500 1000 代码如下: ...

  6. 修改文件的所有者失(chown: changing ownership of `uploads': Operation not permitted)

    在项目开发的时候,经常需要将文件上传到指定的目录下. 例如这次用thinkphp5的时候,需要在public目录下建立uploads目录用于存放上传的资源. 首先在命令窗口下输入: mkdir upl ...

  7. CentOS7修改网卡名称,禁用ipv6

    有时候新装的CentOS7系统网卡默认名称是eno16777736,为方便改成传统eth0 修改网络配置文件 # cd /etc/sysconfig/network-script/ # vim ifc ...

  8. [译]ASP.NET Core 2.0 系列文章目录

    基础篇 [译]ASP.NET Core 2.0 中间件 [译]ASP.NET Core 2.0 带初始参数的中间件 [译]ASP.NET Core 2.0 依赖注入 [译]ASP.NET Core 2 ...

  9. java 以a为开头单词的词典查询示例

    java中HashMap类表示为字典类,其中key,value一一对应的原则.因此是词典查询的首要工具.(HashMap字典类字面意思也可以看出~~) 程序思路: 程序开始前,应先创建一个字典文本用于 ...

  10. JavaScript系列----面向对象的JavaScript(1)

    1.面向对象的编程 1.1.什么是面向对象编程 面向对象编程:即是把能够完成独立完成一部分功能的代码封装在一起,组成一个类. 举个例子来说: 这里有一把枪, 枪的种类很多,有步枪,机关枪,阻击枪... ...