Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Trier les colonnes pour le pivot dynamique

Vous pouvez ajuster l'ordre des champs dans une requête pivot dynamique en ajoutant un ORDER BY lorsque vous définissez votre @cols chaîne :

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
                    from #TempTable
                    ORDER BY ....
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

Mise à jour :Vous avez manqué le DISTINCT au début, lors de l'utilisation de DISTINCT vous devrez utiliser une sous-requête puis ORDER BY :

SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(ColName) 
                    FROM (SELECT DISTINCT 'Month'+cast(DATEPART(m, [Inv Date]) as varchar(2)) ColName
                          FROM #TempTable
                          )sub
                    ORDER BY ColName
                    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

Vous devrez peut-être ajouter un champ de "tri" dans votre sous-requête si vous ne pouvez pas simplement utiliser le nom de la colonne, et vous pouvez ajouter n'importe quel champ à la sous-requête tant qu'il ne perturbe pas le DISTINCT liste. Par exemple :

SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(ColName) 
                    FROM (SELECT DISTINCT 'Month'+cast(DATEPART(m, [Inv Date]) as varchar(2)) ColName
                                          ,CASE WHEN field = 'something' THEN 1
                                                WHEN field = 'something else' THEN 2
                                                ELSE 3
                                           END as Sort
                                          ,Cust_ID
                          FROM #TempTable
                          )sub
                    ORDER BY Sort,Cust_ID
                    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')