pay统计

#mysql默认结束标识符为";",但是有多个语句需要执行,所以定义 为 一 句 s q l 的 结 束 标 志 , 取 消 " ; " 的 所 代 表 的 意 义 ; d e l i m i t e r 为一句sql的结束标志,取消";"的所代表的意义; delimiter sql,";";delimiter

#如果存在名字为recyclingStatistical的procedure(存储过程)则删除;
DROP PROCEDURE IF EXISTS recyclingStatisticalPay;

#创建(创建函数使用的关键字为function 函数名());
CREATE PROCEDURE recyclingStatisticalPay()
BEGIN

声明变量

DECLARE p_time varchar(20);
DECLARE m_id int;
DECLARE p_type int;
DECLARE p_money int;

设置游标初始值为0;

DECLARE flag INT DEFAULT 0;

DECLARE(定义变量) CURSOR(游标=数组中的下标,标识数据去到什么地方了) 记录sql查询的结果;

DECLARE id_list CURSOR FOR SELECT member_pay_time,member_id,member_pay_type,member_pay_money FROM t_member_pay WHERE member_pay_third_orderid NOT LIKE ‘10000005%’ AND member_pay_time < ‘2020-01-13 00:00:00’;

为下面while循环建立一个退出标志,当游标遍历完后将flag的值设置为1;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;

打开定义的游标id_list;

OPEN id_list;

将游标中的值赋给定义好的变量,实现for循环的要点;

FETCH id_list INTO p_time,m_id,p_type,p_money;#p_type:充值方式: 1 applePay, 2 googlePay

WHILE flag <> 1 DO
	# 在T-SQL中,局部变量必须以@作为前缀,声明方式set,select还有点差别;
	SET @totalRegisteredNum = 0;#总首充人数
	SET @iosRegisteredNum = 0;#ios首充人数
	SET @androidRegisteredNum = 0;#安卓首充人数
	SET @dayTotalRecovery = 0;#当日合计回收
	SET @dayIosRecovery = 0;#当日ios回收
	SET @dayAndroidRecovery = 0;#当日安卓回收
	SET @totalHistoricalRecovery = 0;#合计历史回收
	SET @iosHistoricalRecovery = 0;#ios历史回收
	SET @androidHistoricalRecovery = 0;#安卓历史回收

	#判断这个用户在这个时间点之前是否有充值记录
	#有充值记录 非首充
	IF(SELECT COUNT(*) FROM t_member_pay WHERE member_id = m_id AND member_pay_time < LEFT(p_time,10)) > 0 THEN
		SET @oldTime = (SELECT MIN(member_pay_time) FROM t_member_pay WHERE member_id = m_id AND member_pay_time < LEFT(p_time,10));#最早充值日期
		#有统计数据 更新
		IF(SELECT COUNT(*) FROM t_recycling_statistical_pay WHERE recycling_day = LEFT(@oldTime,10)) > 0 THEN
			#总历史回收
			UPDATE t_recycling_statistical_pay SET total_historical_recovery = total_historical_recovery + p_money WHERE recycling_day = LEFT(@oldTime,10);
			#ios历史回收
			IF p_type = 1 THEN
				UPDATE t_recycling_statistical_pay SET ios_historical_recovery = ios_historical_recovery + p_money WHERE recycling_day = LEFT(@oldTime,10);
			#安卓历史回收
			ELSEIF p_type = 2 THEN	
				UPDATE t_recycling_statistical_pay SET android_historical_recovery = android_historical_recovery + p_money WHERE recycling_day = LEFT(@oldTime,10);
			END IF;
		END IF;
	#无充值记录 是首充
	ELSE

		#判断这个时间之前是否有充值 没有充值 是首充人
		IF(SELECT COUNT(*) FROM t_member_pay WHERE member_id = m_id AND member_pay_time < p_time) = 0 THEN
			#总首充人数+ 1
			SET @totalRegisteredNum = 1;
			#ios首充人数+ 1
			IF p_type = 1 THEN 
				SET @iosRegisteredNum = 1;
			#安卓首充人数+ 1
			ELSEIF p_type = 2 THEN	
				SET @androidRegisteredNum = 1;
			END IF;
		END IF;

		#当日合计回收+ p_money
		SET @dayTotalRecovery = p_money;
		#当日ios回收+ p_money
		IF p_type = 1 THEN 
			SET @dayIosRecovery = p_money;
		#当日安卓回收+ p_money
		ELSEIF p_type = 2 THEN	
			SET @dayAndroidRecovery = p_money;
		END IF;
		
		IF(SELECT COUNT(*) FROM t_recycling_statistical_pay WHERE recycling_day = LEFT(p_time,10)) > 0 THEN
			UPDATE t_recycling_statistical_pay SET 
				total_registered_num = total_registered_num + @totalRegisteredNum,
				ios_registered_num = ios_registered_num + @iosRegisteredNum,
				android_registered_num = android_registered_num + @androidRegisteredNum,
				day_total_recovery = day_total_recovery + @dayTotalRecovery,
				day_ios_recovery = day_ios_recovery + @dayIosRecovery,
				day_android_recovery = day_android_recovery + @dayAndroidRecovery,
				total_historical_recovery = total_historical_recovery + @dayTotalRecovery,
				ios_historical_recovery = ios_historical_recovery + @dayIosRecovery,
				android_historical_recovery = android_historical_recovery + @dayAndroidRecovery
			WHERE recycling_day = LEFT(p_time,10);
		ELSE 
			INSERT INTO t_recycling_statistical_pay(
				recycling_day,
				total_registered_num,
				ios_registered_num,
				android_registered_num,
				day_total_recovery,
				day_ios_recovery,
				day_android_recovery,
				total_historical_recovery,
				ios_historical_recovery,
				android_historical_recovery
			) VALUES(
				LEFT(p_time,10),
				@totalRegisteredNum,
				@iosRegisteredNum,
				@androidRegisteredNum,
				@dayTotalRecovery,
				@dayIosRecovery,
				@dayAndroidRecovery,
				@dayTotalRecovery,
				@dayIosRecovery,
				@dayAndroidRecovery
			);
		END IF;

	END IF;

	# 游标往后移(相当于C里面的指针);
	FETCH id_list INTO p_time,m_id,p_type,p_money;
END WHILE;

关闭游标

CLOSE id_list;
END $$

#重新定义";“为一句sql的结束标志,取消之前定义”$$"的所代表意义;
delimiter ;

#调用创建的函数
CALL recyclingStatisticalPay();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值