SQL Server无聚合函数数据转置(Pivot)问题求助
解决多行Charge转固定10列的问题
要实现将多行Charge转为横向10列的需求,核心是先给每组数据的Charge行分配唯一序号,再通过条件聚合完成转置。以下是具体实现方案:
步骤1:给Charge行添加分组序号
因为每个name对应的MinVal和MaxVal值一致,我们按name分区,给每行Charge分配递增序号,用于后续映射为列:
SELECT name, MinVal, MaxVal, Charge, -- 按name分组,给Charge排序并分配序号 ROW_NUMBER() OVER (PARTITION BY name ORDER BY Charge) AS ChargeSeq FROM #Charges
步骤2:条件聚合生成固定10列
基于上面的子查询,用CASE语句配合聚合函数,将不同序号的Charge映射到对应列,不足10条的列会显示NULL:
SELECT name, MinVal, MaxVal, MAX(CASE WHEN ChargeSeq = 1 THEN Charge END) AS Charge1, MAX(CASE WHEN ChargeSeq = 2 THEN Charge END) AS Charge2, MAX(CASE WHEN ChargeSeq = 3 THEN Charge END) AS Charge3, MAX(CASE WHEN ChargeSeq = 4 THEN Charge END) AS Charge4, MAX(CASE WHEN ChargeSeq = 5 THEN Charge END) AS Charge5, MAX(CASE WHEN ChargeSeq = 6 THEN Charge END) AS Charge6, MAX(CASE WHEN ChargeSeq = 7 THEN Charge END) AS Charge7, MAX(CASE WHEN ChargeSeq = 8 THEN Charge END) AS Charge8, MAX(CASE WHEN ChargeSeq = 9 THEN Charge END) AS Charge9, MAX(CASE WHEN ChargeSeq = 10 THEN Charge END) AS Charge10 FROM ( SELECT name, MinVal, MaxVal, Charge, ROW_NUMBER() OVER (PARTITION BY name ORDER BY Charge) AS ChargeSeq FROM #Charges ) t GROUP BY name, MinVal, MaxVal
为什么直接用Pivot容易出错?
Pivot的FOR子句需要依赖一个列的离散值生成新列,而你的原始数据中没有现成的"列序号"字段。如果直接对Charge列做Pivot,会把Charge的具体值作为列名,完全不符合需求。必须先生成序号列,才能用Pivot实现相同效果(条件聚合更直观易控)。
效果验证
执行上述代码后,针对测试数据会得到如下结果:
| name | MinVal | MaxVal | Charge1 | Charge2 | Charge3 | Charge4 | Charge5 | ... | Charge10 |
|---|---|---|---|---|---|---|---|---|---|
| Foo | 50.00 | 500.00 | 0.500000 | 1.000000 | 1.500000 | 1.750000 | NULL | ... | NULL |
完全匹配你想要的输出格式,且支持最多10个Charge列的需求。
内容的提问来源于stack exchange,提问作者Bob Tway
相关产品推荐
相关产品推荐

