博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个关于mysql分页查询的存储过程写法
阅读量:4147 次
发布时间:2019-05-25

本文共 5038 字,大约阅读时间需要 16 分钟。

DELIMITER $$DROP PROCEDURE IF EXISTS `drugConsumptionStatistics`$$CREATE PROCEDURE drugConsumptionStatistics(  -- 输入参数	IN hosCode VARCHAR(128),-- 机构编码	IN prescriptionSource VARCHAR(128),-- 处方来源	IN deptCode VARCHAR(128),-- 科室编码	IN startTime VARCHAR(128),-- 开始时间	IN endTime VARCHAR(128),-- 结束时间	IN curPage INT, -- 当前页	IN pageSize INT, -- 每页的数据量		#输出参数	OUT totalCount INT,  #总记录数	OUT pageCount INT    #总页数)BEGIN	-- 计算起始行号	SET @startRow = pageSize * (curPage - 1);	SET @pageSize = pageSize;	SET @rowindex = 0;		SET @whereStr = '';	-- 机构编码	IF (hosCode<>'') THEN	   SET @whereStr = CONCAT(@whereStr, ' and tp.HosCode = ', hosCode);  END IF;		-- 处方来源	IF (prescriptionSource<>'') THEN	   SET @whereStr = CONCAT(@whereStr, ' and tp.PrescriptionSource = ', prescriptionSource);  END IF;		-- 科室	IF (deptCode<>'') THEN	   SET @whereStr = CONCAT(@whereStr, ' and tp.DeptCode = ', deptCode);  END IF;		-- 开始时间	IF (startTime<>'') THEN	   SET @whereStr = CONCAT(@whereStr, ' and tp.PrescriptionTime >= ', startTime);  END IF;		-- 结束时间	IF (endTime<>'') THEN	   SET @whereStr = CONCAT(@whereStr, ' and tp.PrescriptionTime <= ', endTime);  END IF;		SET @whereStr = CONCAT(@whereStr, ' group by tp.HosCode, tp.PrescriptionSource , tp.DeptCode ');	-- 抗菌药物相关数据统计	SET @AntiBacter = CONCAT('SELECT 	tp.HosCode as hosCode, 	tp.PrescriptionSource as prescriptionSource, 	tp.DeptCode as deptCode, 	count(DISTINCT(tp.JZTClaimNo)) as preOfAntiBacter, 	count(DISTINCT(tp.ClientCardCode)) as patOfAntiBacter   FROM t_prescription_drugs tpd   left join t_prescription tp   on tpd.JZTClaimNo = tp.JZTClaimNo 	where tpd.IsAntiBacter = 1 ', @whereStr);	-- 基药相关数据统计	SET @Basic = CONCAT('SELECT tp.HosCode as hosCode, tp.PrescriptionSource as prescriptionSource, tp.DeptCode as deptCode, count(DISTINCT(tp.JZTClaimNo)) as preOfBasic, count(DISTINCT(tp.ClientCardCode)) as patOfBasic FROM t_prescription_drugs tpd left join t_prescription tp on tpd.JZTClaimNo = tp.JZTClaimNo where tpd.IsBasic = 1 ', @whereStr);	-- 注射药相关数据统计	SET @Injection = CONCAT('SELECT 	tp.HosCode as hosCode, 	tp.PrescriptionSource as prescriptionSource, 	tp.DeptCode as deptCode, 	count(DISTINCT(tp.JZTClaimNo)) as preOfInjection, 	count(DISTINCT(tp.ClientCardCode)) as patOfInjection   FROM t_prescription_drugs tpd   left join t_prescription tp 	on tpd.JZTClaimNo = tp.JZTClaimNo 	where tpd.IsInjection = 1 ', @whereStr);	-- 处方信息	SET @Prescription = CONCAT('SELECT 	tp.HosCode as hosCode, 	tp.PrescriptionSource as prescriptionSource, 	tp.DeptCode as deptCode, 	tp.HosName as hosName, 	tp.DeptName as deptName, 	count(DISTINCT(tp.jZTClaimNo)) as totalOfPrescription,  count(DISTINCT(tp.ClientCardCode)) as totalOfPatient,             convert(count(DISTINCT(tpd.DrugCode))/count(tp.jZTClaimNo),decimal(10,2)) as aveOfPrescriptionDrugs, convert(count(DISTINCT(tpd.DrugCode))/count(DISTINCT(tp.ClientCardCode)),decimal(10,2)) as aveOfPatientDrugs 	from t_prescription_drugs tpd 	left join t_prescription tp 	on tpd.JZTClaimNo = tp.JZTClaimNo 	where 1 = 1 ', @whereStr);		SET @strSql = CONCAT(	#'select sql_calc_found_rows  @rowindex:=@rowindex+1 as rownumber,' #记录行号	'select sql_calc_found_rows ',	' x.*, 	  IFNULL(y.preOfAntiBacter, 0) as preOfAntiBacter, 		IFNULL(convert((y.preOfAntiBacter/x.totalOfPrescription),decimal(10,2)), 0) as preProportionsOfAnt, 		IFNULL(y.patOfAntiBacter, 0) as patOfAntiBacter, 		IFNULL(convert((y.patOfAntiBacter/x.totalOfPatient),decimal(10,2)), 0) as patProportionsOfAnt, 		IFNULL(z.preOfBasic, 0) as preOfBasic, 		IFNULL(convert((z.preOfBasic/x.totalOfPrescription),decimal(10,2)), 0) as preProportionsOfBasic, 		IFNULL(z.patOfBasic, 0) as patOfBasic, 		IFNULL(convert((z.patOfBasic/x.totalOfPatient),decimal(10,2)), 0) as patProportionsOfBasic,		IFNULL(w.preOfInjection, 0) as preOfInjection, 		IFNULL(convert((w.preOfInjection/x.totalOfPrescription),decimal(10,2)), 0) as preProportionsOfInjection, 		IFNULL(w.patOfInjection, 0) as patOfInjection, 		IFNULL(convert((w.patOfInjection/x.totalOfPatient),decimal(10,2)), 0) as patProportionsOfInjection		FROM (', @Prescription, ') x 		left join (', @AntiBacter, ') y 		on x.HosCode = y.HosCode and x.PrescriptionSource = y.PrescriptionSource and x.DeptCode = y.DeptCode 		left join (', @Basic, ') z 		on x.HosCode = z.HosCode and x.PrescriptionSource = z.PrescriptionSource and x.DeptCode = z.DeptCode 		left join (', @Injection, ') w 		on x.HosCode = w.HosCode and x.PrescriptionSource = w.PrescriptionSource and x.DeptCode = w.DeptCode limit '		,@startRow		,',' 		,@pageSize		);	  PREPARE strSql FROM @strSql;#定义预处理语句 	EXECUTE strSql;							#执行预处理语句 	DEALLOCATE PREPARE strSql;	#删除定义 	#通过 sql_calc_found_rows 记录没有使用 limit 语句的记录,使用 found_rows() 获取行数	SET totalCount = FOUND_ROWS();		#计算总页数	IF (totalCount <= pageSize) THEN		SET pageCount = 1;	ELSE IF (totalCount % pageSize > 0) THEN		SET pageCount = totalCount / pageSize + 1;	ELSE		SET pageCount = totalCount / pageSize;	END IF;	END IF;END;-- 测试CALL drugConsumptionStatistics('','','','','',1 ,10 ,@totalcount #输出总记录数,@pagecount #输出用页数);SELECT @totalcount,@pagecount;

 

转载地址:http://iwiti.baihongyu.com/

你可能感兴趣的文章
MySQL语句执行优化及分页查询优化,分库分表(一)
查看>>
分库分表需要解决的问题(二)
查看>>
设计模式——单例模式
查看>>
设计模式——命令模式(附框架源码实现)
查看>>
设计模式——装饰器模式(附java源码案例)
查看>>
设计模式——观察者模式
查看>>
设计模式——状态模式
查看>>
设计模式——代理模式之动态代理源码分析JDK1.8(一)
查看>>
设计模式——代理模式之CGLib实现分析JDK1.8(二)
查看>>
MyBatis启动流程源码分析
查看>>
MyBatis缓存实现源码分析
查看>>
Spring中bean的生命周期
查看>>
Spring框架面试题
查看>>
分布式缓存数据库面试题redis
查看>>
Redis持久化方案RDB和AOF
查看>>
Redis当中的事务
查看>>
Redis问题整理
查看>>
Kafka基础概念介绍
查看>>
JVM问题总结
查看>>
SpringBoot+dubbo 注解方式实现入门
查看>>