SQL 游标的存储过程示例
注意事项:两个小数运算的时候都是一种类型! 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 游标的存储过程示例的更多相关文章
- SQL Server 2008 存储过程示例
出处:http://www.jb51.net/article/54730.htm --有输入参数的存储过程-- create proc GetComment (@commentid int) as s ...
- SQL 游标的应用
----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #te ...
- sqL编程篇(三) 游标与存储过程
sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...
- PL/SQL 编程(二)游标、存储过程、函数
游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针, ...
- oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器
PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是 ...
- SQL SERVER 存储过程示例
USE TEST_DEV; SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ================================== ...
- SQL Server之存储过程基础知
什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...
- SQL SERVER 系统存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》
SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...
随机推荐
- [uboot] (第五章)uboot流程——uboot启动流程
http://blog.csdn.net/ooonebook/article/details/53070065 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- java框架学习_mybaties
Mybatis第一天 框架课程 1. 课程计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybati ...
- C# 最齐全的上传图片方法
方法里包括了图片大小限制.图片尺寸.文件内容等等的判断... 该案例是mvc下的demo,支持单张图片上传. public ActionResult Upload() { string imgurl ...
- Linux合上笔记本不进入休眠模式
最近一个问题困扰了我很久,入职之前和人事说过工作中会用自己的电脑,但是人事还是坚持要给我发一个电脑,没办法,公司没有补贴,那就领了吧,索性将这个笔记本配置成了Fedora系统,用来当测试机,但是一 ...
- docker rmi命令-删除image
rmi 删除image Usage: docker rmi IMAGE [IMAGE...]Remove one or more images -f,--force=falseForce remova ...
- ASP.NET Core 请求/查询/响应参数格式转换(下划线命名)
业务场景: 在 ASP.NET Core 项目中,所有的代码都是骆驼命名,比如userName, UserName,但对于 WebApi 项目来说,因为业务需要,一些请求.查询和响应参数的格式需要转换 ...
- WebViewJavascriptBridge浅析
WebViewJavascriptBridge是一个Objective-C与JavaScript进行消息互通的三方库.通过WebViewJavascriptBridge,我们可以很方便的实现OC和Ja ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- PHP 生成验证码(+图片没有显示的解决办法)
今天有需要用到验证码,就敲了个,毕竟用途比较广,所以打算把代码留下来,以后肯定用得上的.当然,今天在做的时候也是有一些问题的,分享出来吧,记录自己所犯的错误,避免以后再掉坑里. 先给个效果图(下面的真 ...
- dwr学习(一):简单dwr实例
博客分类: dwr 最近写ajax写烦了,想着能不能有个更简单的“ajax”,一问就问到这个dwr了.赶紧去官网学习了下,这里写个博客记录一下实例. 测试环境:tomcat6.0 1.新建一个w ...