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

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实现相同效果(条件聚合更直观易控)。

效果验证

执行上述代码后,针对测试数据会得到如下结果:

nameMinValMaxValCharge1Charge2Charge3Charge4Charge5...Charge10
Foo50.00500.000.5000001.0000001.5000001.750000NULL...NULL

完全匹配你想要的输出格式,且支持最多10个Charge列的需求。

内容的提问来源于stack exchange,提问作者Bob Tway

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:24:56