J'ai un tableau de prix Avec Référence, Catégorie de prix (Ex professionnel/Client...) , le poids et le prix Chaque article a X lignes pour une même Référence, Catégorie de prix dépendant du poids Je veux un retour avec Référence, Catégorie de prix , Price1,Price2... J'essaye d'adapter les codes que j'ai trouvés mais j'ai un problème pour lier le poids et les colonnes nommées 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);

Je ne veux pas avoir chaque poids dans une colonne séparée mais seulement classer sur Prix1, prix2...

0
YannickIngenierie 9 oct. 2020 à 13:06

1 réponse

Meilleure réponse

Enfin... Forcer à essayer Je crée une vue sur ma table Avec numéro de ligne basé sur mon groupe par

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

ET dans une procédure stockée

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

Il ne me reste plus qu'à regrouper par et sur chaque colonne ajoutée, mettre Max(Prix1) comme prix1 ,...toujours en utilisant une chaîne variable

1
YannickIngenierie 9 oct. 2020 à 17:13