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

SQL中如何对含日期表头的临时表执行UnPivot逆透视操作

实现临时表的逆透视(UnPivot)操作

嗨,我来帮你搞定这个逆透视需求!先拿一个常见的场景举例,假设你的临时表是用来存储产品每日数据的,日期直接作为表头,结构大概是这样:

CREATE TABLE #Temp (
    ProductID INT,
    [2024-01-01] DECIMAL(10,2),
    [2024-01-02] DECIMAL(10,2),
    [2024-01-03] DECIMAL(10,2)
);

INSERT INTO #Temp VALUES
(1, 100.50, 150.75, 200.00),
(2, 75.25, 80.00, 90.50);

我们的目标是把这些日期表头转成单独的行,最终得到这样的结果:

ProductIDDateValue
12024-01-01100.50
12024-01-02150.75
12024-01-03200.00
22024-01-0175.25
22024-01-0280.00
22024-01-0390.50

下面给你两种实用的实现方式:

方法1:使用UNPIVOT运算符(适用于SQL Server、Oracle等支持该语法的数据库)

UNPIVOT是专门做逆透视的内置运算符,语法简洁又高效:

SELECT 
    ProductID,
    Date,
    Value
FROM #Temp
UNPIVOT (
    Value FOR Date IN ([2024-01-01], [2024-01-02], [2024-01-03])
) AS UnpivotResult;

关键细节说明:

  • Value:你可以自定义这个名字,用来存放原来日期列里的数值
  • Date:同样是自定义名称,用来存储原来的日期表头值
  • IN括号里要列出所有需要转成行的日期列名,注意因为列名是日期格式(带特殊字符),必须用方括号包裹

方法2:使用UNION ALL(通用所有数据库)

如果你的数据库不支持UNPIVOT(比如一些轻量型数据库),用UNION ALL手动拼接行是兼容性最强的方案:

SELECT ProductID, '2024-01-01' AS Date, [2024-01-01] AS Value FROM #Temp
UNION ALL
SELECT ProductID, '2024-01-02' AS Date, [2024-01-02] AS Value FROM #Temp
UNION ALL
SELECT ProductID, '2024-01-03' AS Date, [2024-01-03] AS Value FROM #Temp
ORDER BY ProductID, Date;

关键细节说明:

  • 每个SELECT语句对应一个日期列,把列名转成字符串作为Date列的值,同时取出对应列的数值
  • 用UNION ALL合并所有结果,最后加ORDER BY来整理输出顺序

额外注意点

  • 如果临时表的日期列特别多,优先用UNPIVOT,避免写大量重复的UNION ALL代码
  • 要确保所有要逆透视的列数据类型一致,不然UNPIVOT会报错,必要时可以用CAST或者CONVERT统一类型
  • 如果日期列是动态生成的(比如每次运行临时表的日期都不一样),可能需要用动态SQL来自动拼接UNPIVOT的列列表或者UNION ALL的语句

内容的提问来源于stack exchange,提问作者Balaji G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:48:34