如何在一个列上对 sql server 进行透视,但重命名为动态列

Posted

技术标签:

【中文标题】如何在一个列上对 sql server 进行透视,但重命名为动态列【英文标题】:How do a pivot on sql server on one column but renamed dynamics column 【发布时间】:2020-10-09 10:06:28 【问题描述】:

我有一张参考价格表,价格类别(前专业/客户...),重量和价格 每篇文章都有 X 行相同的参考,价格类别取决于重量 我想要一个带有参考、价格类别、Price1、Price2 的退货... 我尝试调整我找到的代码,但我在链接权重和命名列 PRIX1、PRIX2 时遇到问题...

declare @MAxcols as int  
DECLARE @cols AS NVARCHAR(MAX)='';
/*max of differents price=max columns dynamic to add*/
set @Maxcols = (select  max(NBLignes) from (select  count(*) as NBLignes
FROM [Z_TARIFS_VENTE] as Results 
GROUP BY AR_REF,Cat_Prx) as tmp)

/*Build all dynamic columns */
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)/*remove last , = 'PRIX1,PRIX2,PRIX3...PRIXX'*/
DECLARE @query AS NVARCHAR(MAX);
SELECT @query =
'SELECT
[AR_Ref],
[Cat_Prx],
' + @cols + '
FROM (
Select
  [AR_Ref],
     [Cat_Prx],
     [weight] ,
     [PRIX] 
From
    [Z_TARIFS_VENTE]
) t
PIVOT 
(
Sum(PRIX)
FOR weight IN( ' + @cols + ' )' +/* Here my problem*/
' ) AS p; ';
Execute(@query);

我不想将每个权重放在单独的列中,而只在 Prix1、prix2 上进行分类...

【问题讨论】:

【参考方案1】:

终于...强制尝试 我在我的表上创建了一个视图,其中行号基于我的组由

 ROW_NUMBER() OVER (PARTITION BY [AR_Ref], [Cat_Prx]...)

AND 在存储过程中

declare @MAxcols as int  
set @Maxcols = (select  max(NBLignes) from (select  count(*) as NBLignes
FROM [Z_TARIFS_VENTE] as Results 
GROUP BY AR_REF,EG_Enumere,TQ_RefCF) as tmp)
DECLARE @query AS NVARCHAR(MAX);
SET @query ='SELECT [AR_Ref], [EG_Enumere],[TQ_RefCF]'
DECLARE @cnt INT = 1;
WHILE @cnt < @Maxcols + 1
BEGIN
 SET @query = @query  + ',CASE WHEN IdxRow=' + CAST(@cnt as nvarchar(3)) + ' THEN PRIX ELSE NULL END AS PRIX' + CAST(@cnt as nvarchar(3))
SET @cnt = @cnt + 1;
END
SET @query = @query  + ' FROM Z_TARIFS_VENTE_ROWNUM'
EXECUTE sp_executesql @query

现在我只需要在每个添加的列上进行分组,将 Max(Prix1) 设置为 prix1 ,...始终使用变量字符串

【讨论】:

以上是关于如何在一个列上对 sql server 进行透视,但重命名为动态列的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 SQL Server 使用相同的数据透视列进行多个数据透视

始终加密 - SQL Server 2016 如何在加密列上使用用户案例语句

如何在 Microsoft SQL Server 中制作非数值表的数据透视表?

透视sql server多个表和列

基于 SQL Server 中的一列透视多列

sql server 查询 - 在 n 列之后进行透视