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);
关键修改点说明
- 新增行号生成逻辑:在子查询中用
ROW_NUMBER() OVER(PARTITION BY AR_Ref, Cat_Prx ORDER BY weight),给每个AR_Ref+Cat_Prx的组合分组,组内按weight排序生成从1开始的连续行号,这个行号就是Prix1、Prix2的对应依据。 - 调整Pivot的关联字段:把原代码中
FOR weight IN改成FOR RowNum IN,这样Pivot就会按行号匹配动态生成的PRIXn列,完美实现按顺序排列价格的需求。
内容的提问来源于stack exchange,提问作者YannickIngenierie
相关产品推荐
相关产品推荐

