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语句逐一从游标中获 ...
随机推荐
- mysql 在update中实现子查询的方式
当使用mysql条件更新时--最先让人想到的写法 UPDATE buyer SET is_seller=1 WHERE uid IN (SELECT uid FROM seller) 此语句是错误的, ...
- 标准时间转YYYY-MMM-DD
// 时间处理 formatDate(date, fmt) { let o = { 'M+': date.getMonth() + 1, //月份 'd+': date.getDate(), //日 ...
- 深入理解定位父级offsetParent及偏移大小offsetTop / offsetLeft / offsetHeight / offsetWidth
深入理解定位父级offsetParent及偏移大小 [转载] 前面的话 偏移量(offset dimension)是javascript中的一个重要的概念.涉及到偏移量的主要是offsetLeft.o ...
- 软件推荐-有限元开发软件FELAC
首页:http://yuanjisuan.cn/ 有限元语言及其编译器(Finite Element Language And it’s Compiler),以下简称FELAC是中国科学院数学与系统科 ...
- RobotFramework+Selenium2软件安装教程
1.安装python 必须是 2.7 版本 设置环境变量:F:\software\Python27;F:\software\Python27\Scripts; 重启电脑: 2.安装wxPy ...
- 带参数的main函数以及execl函数的应用
---恢复内容开始--- 代码1:(带参main函数) #include<stdio.h> int main(int number, char *parameter[]) { ; prin ...
- C++ lamba使用
Moderm Effective C++ 条款31 第206提到了按引用捕获局部变量和函数形参时,如果lambda式的生命期依赖于局部变量和函数形参的生命期,需注意空悬引用的问题. 原书的例子不够直观 ...
- Android-Java-静态变量与静态方法内存图
描述Dog对象: package android.java.oop10; public class Dog { public static String name; public static int ...
- [算法专题] LinkedList
前段时间在看一本01年出的旧书<effective Tcp/Ip programming>,这个算法专题中断了几天,现在继续写下去. Introduction 对于单向链表(singly ...
- 解决C#调用执行js报检索 COM 类工厂中 CLSID 为 {0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC} 组件失败
最近做了一个模拟请求的网站简化原网站的繁琐数据,提出有用的数据简单展示并完成post.由于原网站数据有js加密,所以我抓出原网站的js解密方法,由C#调用js得到解密后的数据. 整个抓包的框架是用的苏 ...