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