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

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. C#sealed和final

    sealed用于类时,该类被称为密封类,密封类不能被继承: C#提出了密封方法(sealed method) 的概念,以防止在方法所在类的派生类中对该方法的重载.对方法可以使用sealed 修饰符,这 ...

  2. 《Linux就该这么学》第八天课程

        当一个人的心中,有着更高的山峰想要去攀登时,他就不会在意脚下的泥沼. 今天发一下干货,常用命令的一些总结,今天的理论知识比较多. 原创地址:https://www.linuxprobe.com ...

  3. Linux下nautilus的右键快捷菜单项设置

    某一天我的Linux更新完后, 我照常在文件夹下点击右键想打开终端, 却发现右键快捷菜单没有Open in terminal的菜单项了. 在网上查找了一下, 结合自己系统的情况发现了解决办法. 由于我 ...

  4. python学习第五章

    1.继承 即是一个派生的类(derived class)继承基类(base class)的字段和方法,继承也允许把一个 派生类的对象作为 一个基类 对象对待.通俗来讲就是方便,继承前人的代码,减少工作 ...

  5. Scanner 类的使用

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

  6. CentOS6最佳实践

    一  安装常用软件 常用目录结构 源文件目录  /application,原包文件及解压文件 如  /application/Python-3.6.0.tgz 软件配置目录 /usr/local/ 如 ...

  7. EBS CAS SSO测试

    https://wiki.jasig.org/display/CAS/CASifying+Oracle+Portal https://wenku.baidu.com/view/5f110a85b9d5 ...

  8. maya2018卸载/安装失败/如何彻底卸载清除干净maya2018注册表和文件的方法

    maya2018提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2018失败提示maya2018安装未完成,某些产品无法安装,也有时候想重新安装maya ...

  9. kali渗透windowsXP过程

    文章来源i春秋 这只是一个演示我自己搭建的环境,但是成功率非常高的,对方可以是其系统,首先我开启kali在打开kali终端输入nmap –sP 192.168.1.1/24 这里的ip是我的网关地址你 ...

  10. 从app上传图片到php,再上传到java后端服务器的方法一条龙服务

    在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的.也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依 ...