使用mysql存储过程,通过for循环进行多次union,将日期列转为行数据。
时间: 2024-05-04 20:15:28 浏览: 126
假设有以下表格:
```mysql
CREATE TABLE sales (
id INT PRIMARY KEY AUTO_INCREMENT,
date DATE,
amount INT
);
```
其中存储了每日的销售额,我们想要将每日的销售额按照日期列转为行数据,可以使用以下存储过程:
```mysql
DELIMITER //
CREATE PROCEDURE pivot_sales()
BEGIN
DECLARE start_date DATE;
DECLARE end_date DATE;
DECLARE current_date DATE;
DECLARE query_text VARCHAR(1000);
DECLARE i INT DEFAULT 0;
-- 获取最早和最晚的日期
SELECT MIN(date) INTO start_date FROM sales;
SELECT MAX(date) INTO end_date FROM sales;
-- 创建临时表格存储结果
CREATE TEMPORARY TABLE pivot_table (
date DATE,
amount INT
);
-- 循环每一天的日期
SET current_date = start_date;
WHILE current_date <= end_date DO
-- 构造查询语句
SET query_text = CONCAT(
'INSERT INTO pivot_table (date, amount) SELECT \'',
current_date,
'\', SUM(amount) FROM sales WHERE date = \'',
current_date,
'\''
);
-- 执行查询语句
PREPARE stmt FROM query_text;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 增加日期
SET current_date = DATE_ADD(current_date, INTERVAL 1 DAY);
END WHILE;
-- 输出结果
SELECT * FROM pivot_table;
-- 删除临时表格
DROP TEMPORARY TABLE pivot_table;
END//
DELIMITER ;
```
使用 `CALL pivot_sales()` 执行存储过程即可得到按日期转换后的行数据。
阅读全文