2010-01-31 6 views
11

Ich habe eine Tabelle, die wie folgt aussieht:Kann SQL Server Pivot ohne Kenntnis der resultierenden Spaltennamen?

Month  Site   Val 
2009-12 Microsoft  10 
2009-11 Microsoft  12 
2009-10 Microsoft  13 
2009-12 Google   20 
2009-11 Google   21 
2009-10 Google   22 

Und ich möchte eine 2-Dimension Tisch bekommen, die mir die „Val“ für jeden Monat Seite gibt, wie:

Month  Microsoft  Google 
2009-12  10   20 
2009-11  12   21 
2009-10  13   22 

Aber Der Haken ist, ich kenne nicht alle möglichen Werte, die in "Site" sein können. Wenn eine neue Website angezeigt wird, möchte ich automatisch eine neue Spalte in meiner resultierenden Tabelle abrufen.

Alle Codebeispiele, die ich gesehen habe, die dies tun könnten, erforderte, dass ich "Microsoft und Google" im Abfragetext fest codierte.
I saw one that didn't, aber es war im Grunde fälschen, indem Sie die Sites und eine Abfrage im laufenden Betrieb (concatting eine Zeichenkette), die diese Spaltennamen enthalten hatte.

Gibt es keine Möglichkeit, SQL Server 2008 ohne einen solchen Hack zu machen?

HINWEIS: Ich muss in der Lage sein, dies als eine Abfrage auszuführen, die ich von ASP.Net senden kann, kann ich gespeicherte Prozeduren oder andere Sachen so nicht tun.

Danke!
Daniel

+0

Was Sie sollten möglich sein, indem Sie die Abfrage zur Laufzeit mit 'exec (@sql)' ausführen, siehe [hier] (http://stackoverflow.com/questions/15752112/). – surfmuggle

Antwort

6

Das Beispiel, mit dem Sie verknüpft haben, verwendet dynamisches SQL. Leider gibt es keine andere integrierte Methode zum Pivotieren in SQL Server, wenn die Ausgabespalten nicht im Voraus bekannt sind.

Wenn die Daten nicht zu groß sind, ist es wahrscheinlich am einfachsten, eine normale Zeilenabfrage von ASP.NET auszuführen und Ihren Pivot im Anwendungscode auszuführen. Wenn die Daten sehr groß sind, müssen Sie das SQL dynamisch nach der ersten Abfrage der möglichen Spaltenwerte generieren.

Beachten Sie, dass Sie eigentlich keine SQL-Anweisung schreiben müssen, die dynamisches SQL generiert; Sie können einfach das SQL in ASP.NET generieren, und das wird wahrscheinlich viel einfacher. Vergessen Sie nicht, die eindeutigen Werte zu entkommen, bevor Sie sie in eine generierte Abfrage einfügen, und vergessen Sie nicht, die Teile der SQL-Anweisung zu parametrisieren, die Sie normalerweise ohne Pivot verwenden würden.

-1

Monat wählen, min (Fall-Website, wenn 'microsoft'then val Ende) microsoft, min (Fall-Website, wenn' val Ende google'then) google von withoutpivot Gruppe von Monat

select main.month, 
m.val as microsoft, 
g.val as google 
from withoutpivot main 
inner join withoutpivot m on m.month=main.month 
inner join withoutpivot g on g.month=main.month 
where m.site='microsoft' 
and g.site='google'