如何将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
相关产品推荐
相关产品推荐

