如何将MySQL表从行式结构转列式并导出为CSV?
解决方案:长表转宽表并导出CSV
你的需求本质是行转列(长表转宽表),无论是通过SQL还是脚本都可以实现,以下是具体方案:
一、SQL实现方案
不同数据库的行转列语法略有差异,核心思路是按Item分组,将不同Attribute对应的Value映射为单独列:
1. 通用SQL(适用于多数数据库)
用CASE表达式配合分组聚合实现:
SELECT Item, MAX(CASE WHEN Attribute = 'AttrName1' THEN Value END) AS AttrName1, MAX(CASE WHEN Attribute = 'AttrName2' THEN Value END) AS AttrName2, MAX(CASE WHEN Attribute = 'AttrName3' THEN Value END) AS AttrName3 FROM your_table_name GROUP BY Item;
执行完该查询后,直接通过数据库客户端导出结果为CSV即可(主流数据库客户端均支持此功能)。
2. 特定数据库简化语法
- SQL Server:使用
PIVOT函数
SELECT * FROM your_table_name PIVOT ( MAX(Value) FOR Attribute IN ([AttrName1], [AttrName2], [AttrName3]) ) AS PivotTable;
- PostgreSQL:需先启用
tablefunc扩展,再用crosstab函数
-- 启用扩展 CREATE EXTENSION IF NOT EXISTS tablefunc; SELECT * FROM crosstab( 'SELECT Item, Attribute, Value FROM your_table_name ORDER BY 1,2', 'SELECT DISTINCT Attribute FROM your_table_name ORDER BY 1' ) AS ct(Item TEXT, AttrName1 TEXT, AttrName2 TEXT, AttrName3 TEXT);
二、脚本实现方案(以Python为例)
如果SQL实现受限,用Python的pandas库可快速完成处理,代码简洁易维护:
import pandas as pd # 读取原始数据(支持从数据库/本地CSV/Excel读取) # 从数据库读取示例:df = pd.read_sql('SELECT * FROM your_table_name', db_connection) df = pd.read_csv('original_data.csv') # 执行行转列操作 pivoted_df = df.pivot(index='Item', columns='Attribute', values='Value').reset_index() # 导出为目标CSV pivoted_df.to_csv('output_data.csv', index=False)
该脚本会自动完成列名映射,直接生成符合要求的CSV文件。
内容的提问来源于stack exchange,提问作者nphuly
相关产品推荐
相关产品推荐

