2009-07-13 23 views
6

je travaille sur une requête de pivot dynamique sur une table qui contient:SQL dynamique Pivot - comment commander des colonnes

    OID
  • - OrderID
  • Taille - Taille du produit
  • BucketNum - la ordonner que les tailles devraient aller
  • quantité - combien commandé

La colonne de taille contient différentes tailles dependi ng sur l'OID.

Ainsi, en utilisant le code trouvé here, je mets cela ensemble:

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) 

Cela fonctionne très bien, sauf que les en-têtes de colonne (les étiquettes de tailles) ne sont pas dans l'ordre en fonction de la colonne bucketnum. Les sont dans l'ordre en fonction des tailles.

J'ai essayé le tri optionnel By après le pivot, mais cela ne fonctionne pas.

Comment contrôler l'ordre dans lequel les colonnes apparaissent?

Merci

Répondre

7

Vous devez résoudre ce problème:

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

Pour retourner les colonnes dans l'ordre. Vous pourriez avoir à faire quelque chose comme ça au lieu d'utiliser DISTINCT:

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

Ahhhhh! Le bit 'MIN (BucketNum)' était ce dont j'avais besoin !! Merci, merci! – GernBlandston

0

j'ai vu ce lien juste aujourd'hui, qui utilise un CTE pour construire la liste des colonnes (qui, vous pouvez probablement commander) à la volée sans besoin de sql dynamique:

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

+0

Merci, Joel. Je ne l'avais pas vu, mais je vais vérifier! – GernBlandston

+1

Cette solution n'est pas dynamique uniquement dans les noms de colonnes, pas dans le nombre de colonnes, qui nécessiteraient encore une technique dynamique au moment de l'opération de pivotement. J'ai utilisé cette technique pour faire pivoter des plages de dates variables, mais il s'agit toujours de 12 mois, mais cela commence à des mois différents - c'est une transformation de base glissante. –

0

J'ai eu le même problème et a essayé la solution proposée ci-dessus, mais, probablement en raison de mon niveau de compréhension, ne pouvait pas le faire fonctionner. J'ai trouvé qu'un hack simple consistait à créer une table Temp avec les en-têtes de colonnes ordonnées correctement en utilisant des instructions Order by, puis à insérer cette liste dans la variable qui définit les noms des colonnes de requête de pivot dynamique.

par exemple.

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 

A travaillé un régal.

Espérons que cela aide quelqu'un.

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

Bien que cette requête puisse répondre à la question, pouvez-vous fournir un peu plus d'informations sur le fonctionnement de cette réponse? – JAL

+0

Il fonctionne de la même manière que le code dans la publication d'origine, mais il crée un alias pour la colonne afin qu'il puisse avoir un ORDER BY appliqué à celui-ci. – frustratedInFresno