2009-07-13 16 views
6

sto lavorando su una query di rotazione dinamica su una tabella che contiene:SQL dinamico Pivot - come ordinare le colonne

  • OID - IDOrdine
  • Size - dimensioni del prodotto
  • BucketNum - il ordinano che le dimensioni dovrebbero andare
  • quantità - quanti ordinato

La colonna dimensione contiene diverse dimensioni dependi ng sull'OID.

Quindi, utilizzando il codice trovato here, ho messo questo insieme:

DECLARE @listCol VARCHAR(2000) 
DECLARE @query VARCHAR(4000) 

SELECT @listCol = STUFF((SELECT distinct '], [' + [size] 
          FROM  #t 
         FOR 
          XML PATH('') 
         ), 1, 2, '') + ']' 


SET @query = 'SELECT * FROM 
     (SELECT OID, [size], [quantity] 
      FROM #t 
      ) src 
PIVOT (SUM(quantity) FOR Size 
IN (' + @listCol + ')) AS pvt' 


EXECUTE (@query) 

Questa grande opera se non che le intestazioni delle colonne (le etichette dimensioni) non sono in ordine in base alla colonna bucketnum. Sono nell'ordine in base alle dimensioni.

Ho provato l'opzione Ordina per dopo il pivot, ma non funziona.

Come controllo l'ordine di visualizzazione delle colonne?

Grazie

risposta

7

È necessario risolvere questo problema:

SELECT @listCol = STUFF((SELECT distinct '], [' + [size] 
          FROM  #t 
         FOR 
          XML PATH('') 
         ), 1, 2, '') + ']' 

Per riportare le colonne nel giusto ordine. Potrebbe essere necessario fare qualcosa di simile, invece di utilizzare DISTINCT:

SELECT [size] 
FROM  #t 
GROUP BY [size] 
ORDER BY MIN(BucketNum) 
+1

Ahhhhh! Il bit 'MIN (BucketNum)' era quello di cui avevo bisogno !! Grazie, grazie! – GernBlandston

0

ho visto questo link proprio oggi, che utilizza un CTE per costruire l'elenco delle colonne (che, presumibilmente, si poteva ordinare) al volo senza la la necessità di SQL dinamico:

http://blog.stevienova.com/2009/07/13/using-ctes-to-create-dynamic-pivot-tables-in-sql-20052008/

+0

Grazie, Joel. Non l'avevo visto, ma lo controllerò! – GernBlandston

+1

Quella soluzione non è dinamica solo nei nomi di colonne, non nel numero di colonne, che necessiterebbe comunque di una tecnica dinamica al momento dell'operazione di pivot. Ho usato questa tecnica per ruotare intervalli di date variabili, tuttavia dove è sempre 12 mesi, ma inizia in diversi mesi - è una trasformazione di base scorrevole. –

0

ho avuto lo stesso problema e ha cercato la soluzione suggerita sopra, ma, probabilmente a causa del mio livello di comprensione, non poteva farlo funzionare. Ho trovato un semplice trucco per creare una tabella Temp con le intestazioni delle colonne ordinate correttamente usando Order by statements e quindi inserire quell'elenco nella variabile che imposta i nomi delle colonne delle query dinamiche pivot.

ad es.

SELECT WeekNum INTO #T3 
FROM #T2 
GROUP BY WeekNum 
ORDER BY MIN(WeekNum) 

SELECT @ColumnName1 = ISNULL(@ColumnName1 + ',','') + QuoteName(WeekNum) 
FROM (SELECT WeekNum From #T3) AS WeekNum 

Ha funzionato a meraviglia.

La speranza che aiuta qualcuno.

2
SELECT @listCol = STUFF(
     (SELECT DISTINCT ',' + QUOTENAME(size) AS [size] 
     FROM #t 
     ORDER BY [size] 
     FOR XML PATH('') 
+0

Sebbene questa query possa rispondere alla domanda, puoi fornire qualche informazione in più su come funziona questa risposta? – JAL

+0

Funziona allo stesso modo del codice nel post originale ma crea un alias per la colonna in modo che possa essere applicato ad ORDER BY. – frustratedInFresno