MySQL表转置是指将表的行和列进行互换,即将原本的行数据转换为列数据,或将列数据转换为行数据。这种操作在数据分析和报表生成中非常常见。
MySQL表转置主要有两种类型:
假设我们有一个名为 sales 的表,结构如下:
CREATE TABLE sales (
product VARCHAR(50),
region VARCHAR(50),
amount INT
);插入一些示例数据:
INSERT INTO sales (product, region, amount) VALUES
('ProductA', 'Region1', 100),
('ProductA', 'Region2', 200),
('ProductB', 'Region1', 150),
('ProductB', 'Region2', 250);我们可以使用以下查询进行静态转置:
SELECT
GROUP_CONCAT(DISTINCT region) AS regions,
SUM(CASE WHEN region = 'Region1' THEN amount ELSE 0 END) AS Region1,
SUM(CASE WHEN region = 'Region2' THEN amount ELSE 0 END) AS Region2
FROM sales
GROUP BY product;对于动态转置,可以使用存储过程来实现。以下是一个简单的示例:
DELIMITER //
CREATE PROCEDURE DynamicTranspose()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE product VARCHAR(50);
DECLARE region VARCHAR(50);
DECLARE amount INT;
DECLARE cur CURSOR FOR SELECT product, region, amount FROM sales;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DROP TEMPORARY TABLE IF EXISTS temp_transpose;
CREATE TEMPORARY TABLE temp_transpose (
product VARCHAR(50),
Region1 INT,
Region2 INT
);
OPEN cur;
read_loop: LOOP
FETCH cur INTO product, region, amount;
IF done THEN
LEAVE read_loop;
END IF;
UPDATE temp_transpose
SET
Region1 = IF(region = 'Region1', amount, Region1),
Region2 = IF(region = 'Region2', amount, Region2)
WHERE product = product;
IF ROW_COUNT() = 0 THEN
INSERT INTO temp_transpose (product, Region1, Region2)
VALUES (product, IF(region = 'Region1', amount, 0), IF(region = 'Region2', amount, 0));
END IF;
END LOOP;
CLOSE cur;
SELECT * FROM temp_transpose;
END //
DELIMITER ;调用存储过程:
CALL DynamicTranspose();通过以上方法,你可以实现MySQL表的转置操作,并根据具体需求选择合适的转置类型。