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

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. java实现随机产生6位数的方法总结

    package com.yin.test; import java.util.Random; import org.junit.Test; /** * @author v_yinyl * @date ...

  2. noip第20课资料

  3. MySQL与SQL语句的操作

    MySQL与SQL语句的操作 Mysql比较轻量化,企业用的是Oracle,基本的是熟悉对数据库,数据表,字段,记录的更新与修改 1. mysql基本信息 特殊数据库:information_sche ...

  4. Do More With These Great Plugins for Windows Live Writer(old)

    This article is out of day,now we use open live wirter, but we don’t have so much works great plugin ...

  5. navicat连接linux系统中mysql-错误:10038

    输入 命令 netstat -anp(查看所有的进程和端口使用情况) (注:Local Address一列中: 0.0.0.0 表示监听本地所有ip地址,其他电脑是可以访问的,并且修改ip不受影响. ...

  6. 火狐浏览器安装 Modify Headers 插件

    一.火狐浏览器插件安装 这里以火狐浏览器的Modify Headers插件安装为例,展示火狐插件的安装: 1.打开火狐浏览器,右上角选择“附加组件” 2.搜索Modify Headers插件 3.安装 ...

  7. typescript handbook 学习笔记3

    概述 这是我学习typescript的笔记.写这个笔记的原因主要有2个,一个是熟悉相关的写法:另一个是理清其中一些晦涩的东西.供以后开发时参考,相信对其他人也有用. 学习typescript建议直接看 ...

  8. 初识Telerik for AJAX

    由于项目需要,本人又刚入门.net开发,项目经理介绍了一个.net流行的开发框架telerik.于是我开始慢慢学习了,发现这个控件还是不错的,学习到的内容和初学者一起探讨一下. 1:第一步 什么是te ...

  9. list源码2(参考STL源码--侯捷):constructor、push_back、insert

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  10. Docker应用场景

    Docker的应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发布. 在服务型环境中部署和调整数据库或其他的后台应用. 从头编译或者扩展现有的OpenShift或Cloud Foun ...