将日期列转成行的产品数据重构:Excel/SQL高效方案咨询
问题描述
我有多份记录产品单日销量的文件,日期以列名形式存储而非行数据,示例原表如下:
| Product | 01.01.2021 | 02.01.2021 |
|---|---|---|
| product 1 | 10 | 11 |
| product 2 | 11 | 12 |
这类月度文件包含30/31列日期,涵盖18.6万款产品、2年的销量数据,直接用Excel处理难度极大。我需要将其转换为长表格式,示例如下:
| Product | Date | Quantity |
|---|---|---|
| product 1 | 01.01.2021 | 10 |
| product 1 | 02.01.2021 | 11 |
| product 2 | 01.01.2021 | 11 |
| product 2 | 02.01.2021 | 12 |
我尝试过笛卡尔积和交叉连接,但无法关联列名中的日期与对应行的销量数据,现寻求Excel或SQL的高效处理方案,转换后总行数至少达550万。
高效处理方案
一、Excel方案(Power Query,适合批量处理)
Power Query是Excel内置的高效数据转换工具,可轻松处理百万级规模数据:
- 批量导入数据:通过「数据>获取数据>从文件>从文件夹」导入所有月度文件,自动合并为单个数据集。
- 逆透视列转换:
- 选中
Product列,右键选择逆透视其他列,自动生成Attribute(原日期列名)和Value(对应销量)两列。
- 选中
- 列名调整:将
Attribute重命名为Date,Value重命名为Quantity。 - 数据格式校验:将
Date列设置为日期类型,Quantity设置为数值类型。 - 导出结果:将转换后的数据加载到Excel工作表,或直接保存为CSV/Parquet格式。
注意:建议使用64位版本Excel,确保有足够内存支撑大规模数据处理。
二、SQL方案(适合数据库存储场景)
假设数据已导入数据库(如MySQL、SQL Server、PostgreSQL),原表名为product_sales_wide,可通过以下方式实现转换:
MySQL/MariaDB 实现
MySQL无原生UNPIVOT语法,可通过UNION ALL批量拼接列转换逻辑:
SELECT Product, '01.01.2021' AS Date, `01.01.2021` AS Quantity FROM product_sales_wide UNION ALL SELECT Product, '02.01.2021' AS Date, `02.01.2021` AS Quantity FROM product_sales_wide -- 按此格式依次添加所有日期列,可通过Excel/脚本批量生成SQL语句 ORDER BY Product, Date;
SQL Server 实现
使用原生UNPIVOT语法更简洁:
SELECT Product, Date, Quantity FROM product_sales_wide UNPIVOT ( Quantity FOR Date IN ([01.01.2021], [02.01.2021]) -- 列出所有日期列名 ) AS unpvt ORDER BY Product, Date;
PostgreSQL 实现
通过UNNEST结合数组实现:
SELECT Product, UNNEST(ARRAY['01.01.2021', '02.01.2021']) AS Date, UNNEST(ARRAY["01.01.2021", "02.01.2021"]) AS Quantity FROM product_sales_wide ORDER BY Product, Date;
性能优化建议:提前给Product列创建索引,分批次导出结果,避免一次性生成过大数据集。
内容的提问来源于stack exchange,提问作者KacperK
相关产品推荐
相关产品推荐

