注意事项:两个小数运算的时候都是一种类型!

USE [FoodMedicineExam]
GO
/****** Object: StoredProcedure [dbo].[P_DrugExamAnalysis] Script Date: 02/02/2016 10:53:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: PPL
-- Create date: 2016-01-05
-- Description: 考试分析
-- =============================================
ALTER PROCEDURE [dbo].[P_DrugExamAnalysis]
@ProvinceCode VARCHAR(10) , --省份
@CityCode VARCHAR(10) , --城市
@Area VARCHAR(10) , --县级
@DepartCode VARCHAR(10) , --机构
@TrainPlan VARCHAR(10) --培训计划
AS
BEGIN
--检查临时表是否存在,否则删除临时表
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[#tempCounttable]')
AND type IN ( N'U' ) )
BEGIN
DROP TABLE [dbo].[#tempCounttable]
END
--创建临时表
CREATE TABLE #tempCounttable
(
id INT IDENTITY(1, 1)
NOT NULL ,--创建列id,并且每次新增一条记录就会加
passType VARCHAR(10) ,
lv FLOAT
)
--总人数
CREATE TABLE #tmpPeoCount ( peoCount INT )
--通过率
CREATE TABLE #tmpTongguo ( Tongguo FLOAT )
--未通过率
CREATE TABLE #tmpWeitonguo ( Weitonguo FLOAT )
--缺考率
CREATE TABLE #tmpQuekao ( Quekao FLOAT ) --定义临时变量 DECLARE @where VARCHAR(1000) --条件SQL DECLARE @zongCountsql VARCHAR(1000) --总人数
DECLARE @tongGuoCountsql VARCHAR(1000) --通过率
DECLARE @weiTongGuoCountsql VARCHAR(1000) --未通过率
DECLARE @queKaosql VARCHAR(1000) --缺考 DECLARE @zongCount INT --总人数
DECLARE @tongGuoCount FLOAT --通过率
DECLARE @weiTongGuoCount FLOAT --未通过率
DECLARE @queKao FLOAT --缺考 SET @where = ' ' ;
--市局
IF ( @ProvinceCode != '' )
BEGIN
SET @where += ' AND c_project.Province=''' + @ProvinceCode
+ '''' ;
END --市局单位
IF ( @CityCode != '' )
BEGIN
SET @where += ' AND c_project.City=''' + @CityCode + '''' ;
END
--分局
IF ( @Area != '' )
BEGIN
SET @where += ' AND c_project.Area=''' + @Area + '''' ;
END
--单位
IF ( @DepartCode != '' )
BEGIN
SET @where += ' AND c_project.DepartCode=''' + @DepartCode
+ '''' ;
END
--培训
IF ( @TrainPlan != '' )
BEGIN
SET @where += ' AND C_TrainPlan.id=''' + @TrainPlan + '''' ;
END
PRINT ( @where )
--总人数
SET @zongCountsql = 'SELECT COUNT(*)
FROM dbo.c_project
INNER JOIN dbo.C_TrainPlan ON c_project.TrainPlanId = C_TrainPlan.Id
WHERE 1 = 1' + @where ;
INSERT INTO #tmpPeoCount
( peoCount
)
EXEC ( @zongCountsql
)
SELECT @zongCount = peoCount
FROM #tmpPeoCount
PRINT ( @zongCount )
--通过率
SET @tongGuoCountsql = 'SELECT COUNT(*)
FROM dbo.c_project
JOIN C_TrainPlan ON c_project.TrainPlanId = C_TrainPlan.Id
JOIN C_ExamPlan ON C_ExamPlan.TrainPlanId = C_TrainPlan.Id
JOIN c_examanswer ON dbo.c_project.id = dbo.c_examanswer.projectid
JOIN dbo.E_ExamWay ON E_ExamWay.Id = C_ExamPlan.ExamWayId
WHERE c_examanswer.point >= E_ExamWay.PassScore'
+ @where ;
INSERT INTO #tmpTongguo
( Tongguo
)
EXEC ( @tongGuoCountsql
)
SELECT @tongGuoCount = Tongguo
FROM #tmpTongguo
--缺考
SET @queKaosql = 'SELECT COUNT(*)
FROM dbo.c_project
INNER JOIN dbo.C_TrainPlan ON c_project.TrainPlanId = C_TrainPlan.Id
WHERE 1=1 ' + @where
+ ' AND c_project.id NOT IN ( SELECT
projectid
FROM
c_examanswer)'
INSERT INTO #tmpQuekao
( Quekao
)
EXEC ( @queKaosql
)
SELECT @queKao = Quekao
FROM #tmpQuekao --未通过率
SET @weiTongGuoCountsql = 'SELECT COUNT(DISTINCT c_project.id)
FROM dbo.c_project
left JOIN C_TrainPlan ON c_project.TrainPlanId = C_TrainPlan.Id
left JOIN C_ExamPlan ON C_ExamPlan.TrainPlanId = C_TrainPlan.Id
left JOIN c_examanswer ON dbo.c_project.id = dbo.c_examanswer.projectid
JOIN dbo.E_ExamWay ON E_ExamWay.Id = C_ExamPlan.ExamWayId
WHERE c_examanswer.point < E_ExamWay.PassScore'
+ @where ; INSERT INTO #tmpWeitonguo
( Weitonguo
)
EXEC ( @weiTongGuoCountsql
)
SELECT @weiTongGuoCount = Weitonguo
FROM #tmpWeitonguo DECLARE @tonguolv FLOAT
IF ( @tongGuoCount > 0
AND @zongCount > 0
)
BEGIN
SET @tonguolv = ( @tongGuoCount / @zongCount ) * 100
END
ELSE
BEGIN
SET @tonguolv = 0
END
DECLARE @weitongguolv FLOAT
IF ( @weiTongGuoCount > 0
AND @zongCount > 0
)
BEGIN
SET @weitongguolv = ( @weiTongGuoCount / @zongCount ) * 100
END
ELSE
BEGIN
SET @weitongguolv = 0
END
DECLARE @quekaolv FLOAT
IF ( @queKao > 0
AND @zongCount > 0
)
BEGIN
SET @quekaolv = ( @queKao / @zongCount ) * 100
END
ELSE
BEGIN
SET @quekaolv = 0
END
INSERT INTO #tempCounttable
( passType, lv )
VALUES ( '通过率', -- passType - varchar(10)
@tonguolv -- lv - float
)
INSERT INTO #tempCounttable
( passType, lv )
VALUES ( '未通过率', -- passType - varchar(10)
@weitongguolv -- lv - float
)
INSERT INTO #tempCounttable
( passType, lv )
VALUES ( '缺考率', -- passType - varchar(10)
@quekaolv -- lv - float
) DECLARE @sql VARCHAR(100) ;
SET @sql = 'select * from #tempCounttable' ;
EXEC(@sql) --检查临时表是否存在,否则删除临时表 IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[#tempCounttable]')
AND type IN ( N'U' ) )
BEGIN
DROP TABLE [dbo].[#tempCounttable]
DROP TABLE [dbo].[#tmpPeoCount]
DROP TABLE [dbo].[#tmpTongguo]
DROP TABLE [dbo].[#tmpWeitonguo]
DROP TABLE [dbo].[#tmpQuekao]
END
END
GO

SQL 游标的存储过程示例的更多相关文章

  1. SQL Server 2008 存储过程示例

    出处:http://www.jb51.net/article/54730.htm --有输入参数的存储过程-- create proc GetComment (@commentid int) as s ...

  2. SQL 游标的应用

    ----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #te ...

  3. sqL编程篇(三) 游标与存储过程

    sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...

  4. PL/SQL 编程(二)游标、存储过程、函数

    游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针, ...

  5. oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器

    PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是 ...

  6. SQL SERVER 存储过程示例

    USE TEST_DEV; SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ================================== ...

  7. SQL Server之存储过程基础知

    什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...

  8. SQL SERVER 系统存储过程

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  9. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

随机推荐

  1. uva1673(后缀自动机)

    后缀自动机还是只会打板子,已经知道它是个什么东西了,但还是和它的构造联系不起来..先背板子吧. 后缀自动机有一个很好的特性就是可以涵盖所有不重复的子串,我们利用这一点在它上面dp就行了: 代码参考:h ...

  2. Scanner 类的使用

    /* Scanner类的使用: 1.导类 2.创建对象 3.调用对应的方法获取数据 */ import java.util.Scanner;//导入Scanner类 public class IfDe ...

  3. springMVC一个Controller处理所有用户请求的并发问题(转)

    springMVC一个Controller处理所有用户请求的并发问题 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.一 ...

  4. delphi如何在form显示出来后处理指定的事件(例如自动登录)

    最近写一个delphi客户端,遇到一个自动登录问题,已经解决了思路如下: 1.在Form的oncreate事件中读取用户配置文件,检查及处理是否保存了用户密码,是否自动登录,如果需要自动登录, 自动登 ...

  5. Delphi使用iTools安卓模拟器

    Delphi使用iTools安卓模拟器 1.去官网下载或https://pc.qq.com/detail/11/detail_22131.html 2.安装后,需要通过设置功能,设置一下分辩率,变成手 ...

  6. 进程控制(Note for apue and csapp)

    1. Introduction We now turn to the process control provided by the UNIX System. This includes the cr ...

  7. 将Linux(ubuntu)安装到U盘上,实现即插即用

    说明: 本教程是说明如何将ubuntu系统安装到U盘上(也就是把U盘当做电脑的硬盘),可以实现U盘插到任何电脑上都能够在实体机上运行ubuntu系统,而且所有的运行配置都能被保存,相当于随身携带的一个 ...

  8. python 使用多进程实现并发编程/使用queue进行进程间数据交换

    import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...

  9. 我的FP感悟

    FP概要: 我主要总结了以下5点: 函数是一等公民: 函数的参数是函数,返回值是函数,类型还是函数... 舍弃语句,拥抱表达式: 表达式就一定有返回值. 无副作用: 不修改外部系统的状态. immut ...

  10. JavaScript基础-第2章

    目标 常用数据类型 基本语法 变量的定义与赋值 数据类型与转换 逻辑控制语句 条件语句 循环语句 函数定义 基本语法 变量 变量名以字母或下划线("_")开头 变量可以包含数字.从 ...