Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Classificar colunas para pivô dinâmico


Você pode ajustar a ordem dos campos em uma consulta dinâmica dinâmica adicionando um ORDER BY quando você define seu @cols corda:
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,'')

Atualização:faltou o DISTINCT a princípio, ao usar DISTINCT você terá que usar uma subconsulta e então 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,'')

Você pode precisar adicionar um campo 'classificar' em sua subconsulta se não puder simplesmente usar o nome da coluna e pode adicionar quaisquer campos à subconsulta, desde que eles não interrompam o DISTINCT Lista. Por exemplo:
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,'')