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

SQL Server中单列动态重命名列的Pivot转换技术问题

解决动态Pivot按顺序生成Price列的问题

你当前代码的核心问题是直接用weight字段作为Pivot的列依据,但你需要的是同一Reference和Price Category分组下,按weight的顺序生成连续的Prix1、Prix2...列,而非把每个weight值当作独立列名。

解决方案思路

要实现这个需求,我们需要先给每个分组内的记录按weight排序生成行号,再基于这个行号做动态Pivot,这样就能把组内第一条记录对应Prix1,第二条对应Prix2,以此类推。

修改后的完整代码

DECLARE @Maxcols AS INT
DECLARE @cols AS NVARCHAR(MAX) = '';

-- 计算每个(AR_Ref, Cat_Prx)组内的最大行数,确定需要生成的Prix列数量
SET @Maxcols = (
    SELECT MAX(NBLignes) 
    FROM (
        SELECT COUNT(*) AS NBLignes 
        FROM [Z_TARIFS_VENTE] 
        GROUP BY AR_REF, Cat_Prx
    ) AS tmp
);

-- 动态生成PRIX1, PRIX2,...PRIXn的列名列表
DECLARE @cnt INT = 0;
WHILE @cnt < @Maxcols BEGIN
    SET @cols = @cols + 'PRIX' + CAST(@cnt + 1 AS NVARCHAR(3)) + ',';
    SET @cnt = @cnt + 1;
END
SET @cols = LEFT(@cols, LEN(@cols) - 1); -- 移除最后多余的逗号

-- 构建动态查询:核心是先给分组内的记录按weight排序生成行号
DECLARE @query AS NVARCHAR(MAX);
SELECT @query = '
SELECT [AR_Ref], [Cat_Prx], ' + @cols + ' 
FROM (
    SELECT 
        [AR_Ref], 
        [Cat_Prx], 
        [PRIX],
        -- 给每个(AR_Ref, Cat_Prx)组内的记录按weight排序,生成连续行号
        ROW_NUMBER() OVER(PARTITION BY AR_Ref, Cat_Prx ORDER BY weight) AS RowNum
    FROM [Z_TARIFS_VENTE]
) t 
PIVOT (
    SUM(PRIX) FOR RowNum IN( ' + @cols + ' )
) AS p;';

EXECUTE(@query);

关键修改点说明

  1. 新增行号生成逻辑:在子查询中用ROW_NUMBER() OVER(PARTITION BY AR_Ref, Cat_Prx ORDER BY weight),给每个AR_Ref+Cat_Prx的组合分组,组内按weight排序生成从1开始的连续行号,这个行号就是Prix1、Prix2的对应依据。
  2. 调整Pivot的关联字段:把原代码中FOR weight IN改成FOR RowNum IN,这样Pivot就会按行号匹配动态生成的PRIXn列,完美实现按顺序排列价格的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:37:44