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

如何将SQL数据集按OrderId和Value进行宽表转换(Pivot Wider)

问题:将长表转换为保留NULL值的宽表

测试数据集

IdCx FecCx       OrderId Value
1234 2022-08-15     1    07:50
1234 2022-08-15     2    08:00
1234 2022-08-15     3    08:24
5678 2022-08-16     1    14:45
5678 2022-08-16     3    15:30

需要基于OrderId和Value将上述长表转换为宽表,要求缺失的OrderId对应的字段保留NULL值,期望结果如下:

期望结果

IdCx FecCx       Val1  Val2  Val3
1234 2022-08-15  07:50 08:00 08:24
5678 2022-08-16  14:45 NULL  15:30

最初尝试用CASE语句,但生成的数据集存在大量冗余NULL值,无法合并行。


解决方案

方法1:CASE语句配合聚合函数+GROUP BY

之前用CASE未合并行,是因为缺少分组聚合逻辑。通过对CASE表达式取MAX(或MIN),并按IdCx和FecCx分组即可实现行合并:

SELECT
    IdCx,
    FecCx,
    MAX(CASE WHEN OrderId = 1 THEN Value END) AS Val1,
    MAX(CASE WHEN OrderId = 2 THEN Value END) AS Val2,
    MAX(CASE WHEN OrderId = 3 THEN Value END) AS Val3
FROM YourTable
GROUP BY IdCx, FecCx
ORDER BY IdCx, FecCx;

方法2:使用PIVOT函数

SQL Server的PIVOT函数可直接实现行转列,自动将缺失值填充为NULL,写法更简洁:

SELECT
    IdCx,
    FecCx,
    [1] AS Val1,
    [2] AS Val2,
    [3] AS Val3
FROM YourTable
PIVOT (
    MAX(Value)
    FOR OrderId IN ([1], [2], [3])
) AS PivotTable
ORDER BY IdCx, FecCx;

两种方法均可得到符合要求的结果:CASE+GROUP BY更灵活,适合后续动态扩展OrderId的场景;PIVOT则更简洁直观。


内容的提问来源于stack exchange,提问作者Andres Mora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:15:30