要達到的效果:
MySQL不支持動態行轉列
原始數據:
以行的方式存儲
CREATE TABLE product_sales (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(50) NOT NULL,category VARCHAR(50) NOT NULL,sales_volume INT NOT NULL,sales_date DATE NOT NULL
);INSERT INTO product_sales (product_name, category, sales_volume, sales_date) VALUES
('iPhone', '電子產品', 50, '2025-01-01'),
('MacBook', '電子產品', 30, '2025-01-01'),
('iPad', '電子產品', 40, '2025-01-01'),
('襯衫', '服裝', 60, '2025-01-01'),
('牛仔褲', '服裝', 55, '2025-01-01'),
('連衣裙', '服裝', 70, '2025-01-01'),
('蘋果', '食品', 80, '2025-01-01'),
('牛奶', '食品', 75, '2025-01-01'),
('面包', '食品', 65, '2025-01-01'),
('iPhone', '電子產品', 45, '2025-01-02'),
('MacBook', '電子產品', 25, '2025-01-02'),
('iPad', '電子產品', 35, '2025-01-02'),
('襯衫', '服裝', 55, '2025-01-02'),
('牛仔褲', '服裝', 50, '2025-01-02'),
('連衣裙', '服裝', 65, '2025-01-02'),
('蘋果', '食品', 95, '2025-01-05'),
('牛奶', '食品', 90, '2025-01-05'),
('面包', '食品', 80, '2025-01-05');
行轉列:
列的形成,使用關鍵字CASE WHEN
SELECTsales_date AS '銷售日期',CASE WHEN product_name = 'iPhone' THEN sales_volume ELSE 0 END AS 'iPhone',CASE WHEN product_name = 'MacBook' THEN sales_volume ELSE 0 END AS 'MacBook',CASE WHEN product_name = 'iPad' THEN sales_volume ELSE 0 END AS 'iPad',CASE WHEN product_name = '襯衫' THEN sales_volume ELSE 0 END AS '襯衫',CASE WHEN product_name = '牛仔褲' THEN sales_volume ELSE 0 END AS '牛仔褲',CASE WHEN product_name = '連衣裙' THEN sales_volume ELSE 0 END AS '連衣裙',CASE WHEN product_name = '蘋果' THEN sales_volume ELSE 0 END AS '蘋果',CASE WHEN product_name = '牛奶' THEN sales_volume ELSE 0 END AS '牛奶',CASE WHEN product_name = '面包' THEN sales_volume ELSE 0 END AS '面包',sales_volume AS '日總銷量'
FROMproduct_sales;
結果:
形成了這樣的大表
去除冗余數據:
SELECTsales_date AS '銷售日期',SUM(CASE WHEN product_name = 'iPhone' THEN sales_volume ELSE 0 END) AS 'iPhone',SUM(CASE WHEN product_name = 'MacBook' THEN sales_volume ELSE 0 END) AS 'MacBook',SUM(CASE WHEN product_name = 'iPad' THEN sales_volume ELSE 0 END) AS 'iPad',SUM(CASE WHEN product_name = '襯衫' THEN sales_volume ELSE 0 END) AS '襯衫',SUM(CASE WHEN product_name = '牛仔褲' THEN sales_volume ELSE 0 END) AS '牛仔褲',SUM(CASE WHEN product_name = '連衣裙' THEN sales_volume ELSE 0 END) AS '連衣裙',SUM(CASE WHEN product_name = '蘋果' THEN sales_volume ELSE 0 END) AS '蘋果',SUM(CASE WHEN product_name = '牛奶' THEN sales_volume ELSE 0 END) AS '牛奶',SUM(CASE WHEN product_name = '面包' THEN sales_volume ELSE 0 END) AS '面包',SUM(sales_volume) AS '日總銷量'
FROMproduct_sales
GROUP BYsales_date
ORDER BYsales_date;
結果:
列轉行:
數據:
CREATE TABLE sales_data (sale_date DATE PRIMARY KEY,p_001 INT,p_002 INT,p_003 INT,p_004 INT,p_005 INT,p_006 INT,p_007 INT,p_008 INT,p_009 INT,p_010 INT
);
INSERT INTO sales_data (sale_date, p_001, p_002, p_003, p_004, p_005, p_006, p_007, p_008, p_009, p_010) VALUES
('2025-01-01', 50, 30, 40, 60, 55, 70, 80, 75, 65, 525),
('2025-01-02', 45, 25, 35, 55, 50, 65, 75, 70, 60, 480),
('2025-01-03', 55, 35, 45, 65, 60, 75, 85, 80, 70, 570),
('2025-01-04', 60, 40, 50, 70, 65, 80, 90, 85, 75, 615),
('2025-01-05', 65, 45, 55, 75, 70, 85, 95, 90, 80, 660);
操作:
使用UNION ALL關鍵字
SELECTsale_date,'p_001' AS product_id,p_001 AS sales_amount
FROM sales_data
UNION ALL
SELECTsale_date,'p_002' AS product_id,p_002 AS sales_amount
FROM sales_data
UNION ALL
SELECTsale_date,'p_003' AS product_id,p_003 AS sales_amount
FROM sales_data.......
結果: