You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将日期列转成行的产品数据重构:Excel/SQL高效方案咨询

问题描述

我有多份记录产品单日销量的文件,日期以列名形式存储而非行数据,示例原表如下:

Product01.01.202102.01.2021
product 11011
product 21112

这类月度文件包含30/31列日期,涵盖18.6万款产品、2年的销量数据,直接用Excel处理难度极大。我需要将其转换为长表格式,示例如下:

ProductDateQuantity
product 101.01.202110
product 102.01.202111
product 201.01.202111
product 202.01.202112

我尝试过笛卡尔积和交叉连接,但无法关联列名中的日期与对应行的销量数据,现寻求Excel或SQL的高效处理方案,转换后总行数至少达550万。

高效处理方案

一、Excel方案(Power Query,适合批量处理)

Power Query是Excel内置的高效数据转换工具,可轻松处理百万级规模数据:

  1. 批量导入数据:通过「数据>获取数据>从文件>从文件夹」导入所有月度文件,自动合并为单个数据集。
  2. 逆透视列转换:
    • 选中Product列,右键选择逆透视其他列,自动生成Attribute(原日期列名)和Value(对应销量)两列。
  3. 列名调整:将Attribute重命名为Date,Value重命名为Quantity。
  4. 数据格式校验:将Date列设置为日期类型,Quantity设置为数值类型。
  5. 导出结果:将转换后的数据加载到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 13:34:58