• mysql 生成时间序列数据


       由于时间自动转换为int值, 做一步转化,也可在调用时处理

    use `test`;
    
    CREATE table test.test1 as 
    SELECT state, id, `规格条码`,
    `色号条码`, 
    `货号`, 
    `在售平台`, 
    `平台售价`, 
    DATE_ADD('1900-01-01', Interval data1.`上架时间` day) as `上架时间`,
    `下架时间`,
    `操作员`
    FROM data1;
    
    CREATE table test.test2 as 
    SELECT state, id, 
    DATE_ADD('1900-01-01', Interval `时间` day) as `时间`,
    `在售平台`, 
    `规格条码`, 
    `销量`,
    `销售额`,
    `撤销标志`
    FROM data2;
    

      

       生成时间序列数据

    USE `test`;
    DROP TABLE IF EXISTS tmptb;
    CREATE TEMPORARY TABLE tmptb (
    	id INT UNSIGNED AUTO_INCREMENT,
    	date DATE NOT NULL,
     	shop VARCHAR(20) NOT NULL DEFAULT 0,
    	sales INT UNSIGNED DEFAULT 0,
    	PRIMARY KEY ( id )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    DELIMITER //
    DROP PROCEDURE IF EXISTS DayRangeProc//
    CREATE PROCEDURE DayRangeProc (	IN start_date DATE,	IN end_date DATE)
    	BEGIN
    		DECLARE i, range_day INT;
    		SET i = 0;
    		SET range_day = (SELECT DATEDIFF(end_date, start_date));
    		WHILE i <= range_day DO
    			INSERT INTO tmptb(date) VALUES (ADDDATE(start_date, i));
    -- 			SET @sqlcmd = CONCAT('INSERT INTO ', tmptb, ' (date) VALUES (', temp, ')');
    -- 			PREPARE stmt FROM @sqlcmd;
    -- 			EXECUTE stmt;
    -- 			DEALLOCATE PREPARE stmt;
    			SET i = i + 1;
    		END	WHILE;
    	END;
    //
    
    DELIMITER ;
    CALL DayRangeProc ('2010-09-01', '2010-09-10'); 
    SELECT * FROM	tmptb;
    

      

      从test1表与test2表,产生每个产品上架以来每天在每个平台的销售情况,如无销售数据则计销量为0

    USE `test`;
    DROP TABLE IF EXISTS result;
    CREATE TABLE result (
    	-- 保存结果数据
    	id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    	date DATE NOT NULL,
    	product_id VARCHAR(20) NOT NULL,
    	shop VARCHAR(20) NOT NULL DEFAULT 0,
    	price FLOAT NOT NULL,
    	sales INT(8) DEFAULT 0,
    	amount DOUBLE DEFAULT 0,
    	PRIMARY KEY ( id )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS shop_name_tb;
    CREATE TEMPORARY TABLE shop_name_tb AS (SELECT DISTINCT	`在售平台` AS NAME FROM	test2);  -- 保存平台,类似于数组操作
    
    
    
    DELIMITER //
    DROP PROCEDURE IF EXISTS DayRangeProc//
    CREATE PROCEDURE DayRangeProc()
    	BEGIN
    		DECLARE i, j, t INT;
    		DECLARE range_day INT;
    		DECLARE shop_num, prod_num INT;
    		DECLARE start_date, end_date DATE;
    		DECLARE prod_id, shop_name VARCHAR(20);
    		DECLARE price FLOAT;
    
    		SET i = 0;
    		SET j = 0;
    		SET t = 0;
    		SET shop_num = (SELECT COUNT(*) FROM shop_name_tb);
    		SET prod_num = (SELECT COUNT(*) FROM test1);		
    		SET end_date = (SELECT MAX(`时间`) FROM test2 );   -- 由于下架时间均为空,假设都在销
    		-- 产品循环
    		WHILE i <= prod_num DO		
    			SET prod_id = (SELECT `规格条码` FROM test1 LIMIT i,1);  -- 第i个商品名称
    			SET start_date = (SELECT `上架时间` FROM test1 WHERE `规格条码` = prod_id);   -- 第i个商品的上架时间
    			SET range_day = (SELECT DATEDIFF(end_date, start_date));   -- 第i个商品累计销售天数,以便插入相应长度的数据
    
    				-- 平台循环
    				WHILE j <= shop_num DO
    				SET shop_name = (SELECT name FROM shop_name_tb LIMIT j,1);   -- 店铺名称
    				SET price = (SELECT `平台售价` FROM test1 WHERE `规格条码` = prod_id);  -- 第i个商品售价,假设不同平台售价相同
    
    					-- 时间循环
    					WHILE t <= range_day DO
    					INSERT INTO result(date,	product_id, shop, price) 
    						VALUES (ADDDATE(start_date, t), prod_id, shop_name, price);  -- sales, amount
    					SET t = t + 1;
    					END	WHILE;
    
    				SET j = j + 1;
    				END	WHILE;
    			SET i = i + 1;
    		END	WHILE;
    	END;
    //
    
    
    DELIMITER ;
    CALL DayRangeProc (); 
    
    -- 查询数据
    SELECT 
    	result.id,
    	result.date,
    	result.product_id,
    	result.shop,
    	result.price,
    	IF(ISNULL(test2.`销量`), result.sales, test2.`销量`) AS sales,
    	IF(ISNULL(test2.`销售额`), result.amount, test2.`销售额`) AS amount
    FROM	result LEFT JOIN test2 
    ON result.date = test2.`时间` 
    AND result.shop = test2.`在售平台` 
    AND result.product_id = test2.`规格条码`;
    

       

      给定字符串,拆分后输出一列

    USE test;
    DROP TABLE IF EXISTS TEMP;
    CREATE TABLE TEMP (
    	ID INT (8) NOT NULL AUTO_INCREMENT,
    	number VARCHAR(20) NOT NULL,
    	PRIMARY KEY (ID)
    ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '测试';
    
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `Pr_Rand_insert`$$
    CREATE PROCEDURE `Pr_Rand_insert` (	IN insert_string VARCHAR (10000))  -- 定义输入
    	BEGIN
    	DECLARE I INT (8) DEFAULT 1 ;
    	DECLARE J INT (8) DEFAULT 0 ;
    	SET J = CHAR_LENGTH(insert_string) - CHAR_LENGTH(	REPLACE (insert_string, ',', '')) + 1; -- 计算共有多少位为",",则再加上1就表示共有多少个数值需要插入
    	WHILE (I <= J) DO
    		INSERT INTO TEMP(number) VALUES	(SUBSTRING_INDEX(SUBSTRING_INDEX(insert_string, ',', I), ',', - 1)) ; -- 用到了substring_index()函数
    		SET I = I + 1 ;
    	END WHILE ; 
    	-- SELECT	CONCAT('共插入了', J, '个值,请确认');
    	END$$
    DELIMITER ;
    
    CALL Pr_Rand_insert ('231,24,1114,151,7831241,9134,989');
    SELECT * FROM	TEMP;
    

      

  • 相关阅读:
    WebApi 安全认证
    Autofac 学习
    autofac实现批量注入
    Autofac -入门练习
    Struts2 Namespace_命名空间
    Deployment failure on Tomcat 6.x. Could not copy all resources
    chm 已取消到该网页的导航 或者 无法显示网页 的问题
    GPT 分区详解
    mount 中文手册
    rpm 中文手册
  • 原文地址:https://www.cnblogs.com/iupoint/p/9724391.html
Copyright © 2020-2023  润新知