由於時間自動轉換為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;
