2009-07-13 14 views
6

Ich bin auf einem Tisch auf einer dynamischen Dreh Abfrage arbeiten, die enthält:SQL Dynamische Pivot - wie man Spalten bestellen

  • OID - OrderID
  • Size - Größe des Produkts
  • BucketNum - die anordnen, dass die Größen
  • Menge gehen sollte - wie viele bestellt

Die Größe Spalte enthält verschiedene Größen abhängi ng auf die OID.

So fand den Code mit here, ich dies zusammen:

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) 

Dies funktioniert gut, außer dass die Spaltenüberschriften (die Größen Etiketten) sind nicht in der Reihenfolge auf der bucketnum Spalte basiert. Die sind in der Reihenfolge basierend auf den Größen.

Ich habe die optionale Bestellung von nach dem Pivot versucht, aber das funktioniert nicht.

Wie kontrolliere ich die Reihenfolge, in der die Spalten angezeigt werden?

Danke

Antwort

7

Sie müssen dieses Problem beheben:

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

die Spalten in der richtigen Reihenfolge zurückzukehren. Man könnte so etwas zu tun haben, anstatt mit DISTINCT:

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

Ahhhhh! Das 'MIN (BucketNum)' Bit war was ich brauchte !! Danke, danke! – GernBlandston

0

ich diesen Link sah nur heute, die einen CTE verwendet die Spaltenliste zu bauen (was vermutlich, könnten Sie bestellen) on the fly ohne die muß für dynamischen sQL:

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

+0

Danke, Joel. Ich hatte es nicht gesehen, aber ich werde es überprüfen! – GernBlandston

+1

Diese Lösung ist nur in Namen von Spalten nicht dynamisch, nicht in Anzahl von Spalten, die zum Zeitpunkt der Pivot-Operation noch eine dynamische Technik benötigen würden. Ich habe diese Technik verwendet, um variable Datumsbereiche zu schwenken, wobei es immer 12 Monate dauert, aber zu verschiedenen Monaten beginnt - es ist eine grundlegende gleitende Transformation. –

0

ich hatte das gleiche Problem und versuchte, die Lösung vorgeschlagen oben aber, wahrscheinlich aufgrund meiner Ebene des Verständnisses, es konnte nicht an der Arbeit. Ich fand einen einfachen Hack war, eine Temp-Tabelle mit den Spalten-Header korrekt mit Order by-Anweisungen zu erstellen und dann ziehen Sie diese Liste auf die Variable, die die dynamische Pivot-Abfrage Spaltennamen setzt.

z.B.

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 

Arbeitete ein Vergnügen.

Hoffe, dass jemand hilft.

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

Obwohl diese Abfrage die Frage möglicherweise beantwortet, können Sie ein wenig mehr Informationen darüber bereitstellen, wie diese Antwort funktioniert? – JAL

+0

Es funktioniert genauso wie der Code im ursprünglichen Post, aber es erstellt einen Alias ​​für die Spalte, so dass möglicherweise ein ORDER BY darauf angewendet wird. – frustratedInFresno