MySQL存储过程实现,如何将数据拆分为7条

现有一张数据表1,是某商品每个店铺每周的销量数据(用周日的日期代表其所在的周)。现在需要将此数据表转化为如表2的格式,即将每周的销量拆解为该周每天的平均销量数据(日平均销量=周销量/7).

    

数据表1

 

 

 

 

数据表2

 

 

原始数据

 

 

 

 

计算处理后的数据

 

店铺代码

周销售数量

 

 

店铺代码

日期

日平均销售数量

A01

2018/1/7

200

 

A01

2018/1/1

28.57

A01

2018/1/14

300

 

A01

2018/1/2

28.57

A01

2018/1/21

400

 

 

A01

2018/1/3

28.57

A01

2018/1/28

280

 

 

A01

2018/1/4

28.57

A01

2018/2/4

350

 

 

A01

2018/1/5

28.57

A01

2018/2/11

420

 

 

A01

2018/1/6

28.57

A01

2018/2/18

490

 

 

A01

2018/1/7

28.57

A01

2018/2/25

560

 

 

A01

2018/1/8

42.86

A02

2018/1/7

200

 

 

A01

2018/1/9

42.86

A02

2018/1/14

300

 

 

A01

2018/1/10

42.86

A02

2018/1/21

400

 

 

A01

2018/1/11

42.86

A02

2018/1/28

280

 

 

A01

2018/1/12

42.86

A02

2018/2/4

350

 

 

A01

2018/1/13

42.86

A02

2018/2/11

420

 

 

A01

2018/1/14

42.86

A02

2018/2/18

490

 

 

……

……

……

A02

2018/2/25

560

 

 

 

 

 

 

请用sql 语句写一段代码,实现由数据表1到数据表2的自动转换功能。请将答案写在背面。

CREATE DEFINER=`root`@`localhost` PROCEDURE `one`(IN tab1 varchar(30),IN tab2 varchar(30))
BEGIN
	 /* 店铺代码 */
	DECLARE variable_code VARCHAR(50);
	/* 周 */
	DECLARE variable_wek date;
	/* 周销售量 */
	DECLARE variable_num DOUBLE;
	/* 一周7天 */
	declare i int; 
	/* 游标是否读取完毕,完毕后变为1 */
	DECLARE done INT DEFAULT 0;
	/* 声明游标 */
	DECLARE cur CURSOR for SELECT code,week,num/7 as num FROM test_view;
	DECLARE CONTINUE HANDLER FOR  SQLSTATE '02000' SET done = 1;		
	/* 将查到的数据存入视图 */
	DROP VIEW IF EXISTS test_view;  
	SET @sqlstr = "CREATE VIEW test_view as ";  
  SET @sqlstr = CONCAT(@sqlstr,"SELECT code,week,num/7 as num FROM ",tab1);  
  PREPARE stmt FROM @sqlstr;  
  EXECUTE stmt;		
	/* 创建表 */
	DROP TABLE IF EXISTS tab2;
	SET @sqlstr = CONCAT("create table if not exists ",tab2," (
		`code` varchar(255) DEFAULT NULL,
		`wek` date DEFAULT NULL,
		`num` double(11,2) DEFAULT NULL
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");  
	PREPARE stmt FROM @sqlstr;  
	EXECUTE stmt;  
	open cur;
	/* 循环插入数据 */
	REPEAT
		FETCH NEXT FROM cur INTO variable_code,variable_wek,variable_num;
		if not done then		
			set i=7; 
			while i > 0 do
				SET @sqlstr = CONCAT("INSERT INTO ",tab2,"(code,wek,num)VALUES('",variable_code,"','",DATE_ADD(variable_wek,INTERVAL -i DAY),"','",variable_num,"')");  
				PREPARE stmt FROM @sqlstr;  
				EXECUTE stmt;  
			 set i=i-1;
			end while;
    END IF ;
	UNTIL done END REPEAT;
CLOSE cur;
END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值