2010-01-31 13 views
11

Ho una tabella che assomiglia a questo:È possibile eseguire il pivot di SQL Server senza conoscere i nomi delle colonne risultanti?

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 

E voglio ottenere un tavolo 2-dimensione che mi dà la "Val" per il mese di ciascun sito, come:

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

Ma il problema è che non conosco tutti i possibili valori che possono trovarsi in "Sito". Se viene visualizzato un nuovo sito, desidero ottenere automaticamente una nuova colonna nella tabella risultante.

Tutti gli esempi di codice che ho visto che potevano fare questo mi hanno richiesto di inserire hardcode "Microsoft e Google" nel testo della query.
I saw one that didn't, ma fondamentalmente si stava fingendo elencando i Siti e generando una query al volo (concatenando una stringa) che conteneva quei nomi di colonna.

Non c'è un modo per ottenere SQL Server 2008 per eseguire questa operazione senza un attacco del genere?

NOTA: Devo essere in grado di eseguirlo come una query che invio da ASP.Net, non posso eseguire stored procedure o altre cose del genere.

Grazie!
Daniel

+0

Cosa dovresti essere possibile eseguendo la query in fase di esecuzione usando 'exec (@sql)' vedi [qui] (http://stackoverflow.com/questions/15752112/). – surfmuggle

risposta

6

L'esempio a cui è collegato utilizza SQL dinamico. Sfortunatamente, non esiste un altro metodo integrato per la rotazione in SQL Server quando le colonne di output non sono conosciute in anticipo.

Se i dati non sono troppo grandi, è probabilmente più semplice eseguire semplicemente una query di riga normale da ASP.NET ed eseguire il pivot nel codice dell'applicazione. Se i dati sono molto grandi, sarà necessario generare SQL in modo dinamico dopo aver prima eseguito una query per i possibili valori di colonna.

Si noti che in realtà non è necessario scrivere un'istruzione SQL che generi SQL dinamico; puoi semplicemente generare l'SQL in ASP.NET e molto probabilmente sarà molto più semplice. Basta non dimenticare di sfuggire ai distinti valori Site prima di ridurli in una query generata e non dimenticare di parametrizzare le parti dell'istruzione SQL che normalmente utilizzeresti senza il pivot.

-1

selezionare il mese, min (caso del sito quando 'end val microsoft'then) di Microsoft, min (caso del sito quando' google'then end val) google da withoutpivot gruppo dal mese

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' 
Problemi correlati