Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Spalten für dynamischen Pivot sortieren

Sie können die Reihenfolge der Felder in einer dynamischen Pivot-Abfrage anpassen, indem Sie einen ORDER BY hinzufügen wenn Sie Ihren @cols setzen Zeichenkette:

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,'')

Update:DISTINCT verpasst zuerst, wenn DISTINCT verwendet wird Sie müssen eine Unterabfrage und dann ORDER BY verwenden :

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,'')

Möglicherweise müssen Sie Ihrer Unterabfrage ein Sortierfeld hinzufügen, wenn Sie nicht einfach den Spaltennamen verwenden können, und Sie können der Unterabfrage beliebige Felder hinzufügen, solange sie DISTINCT nicht stören aufführen. Zum Beispiel:

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,'')