2010-01-31 12 views
11

Tengo una tabla que tiene este aspecto:¿Puede pivotar SQL Server sin conocer los nombres de las columnas resultantes?

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 

Y quiero conseguir una mesa 2-dimensión que me da el "Val" para el mes de cada sitio, como:

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

Pero la trampa es que no conozco todos los valores posibles que pueden estar en "Sitio". Si aparece un nuevo sitio, quiero obtener automáticamente una nueva columna en la tabla resultante.

Todos los ejemplos de código que vi que podían hacer esto me obligaron a codificar "Microsoft y Google" en el texto de la consulta.
I saw one that didn't, pero básicamente estaba fingiendo al enumerar los Sitios y generar una consulta sobre la marcha (concatenando una cadena) que tenía esos nombres de columna.

¿No hay una manera de hacer que SQL Server 2008 haga esto sin un truco como ese?

NOTA: Necesito poder ejecutar esto como una consulta que envío desde ASP.Net, no puedo hacer procedimientos almacenados u otras cosas por el estilo.

Gracias!
Daniel

+0

Lo lo que estaba buscando debería ser posible al ejecutar la consulta en tiempo de ejecución usando 'exec (@sql)' ver [aquí] (http://stackoverflow.com/questions/15752112/). – surfmuggle

Respuesta

6

El ejemplo al que se ha vinculado usa SQL dinámico. Desafortunadamente, no hay otro método incorporado para pivotar en SQL Server cuando las columnas de salida no se conocen de antemano.

Si los datos no son demasiado grandes, probablemente sea más fácil simplemente ejecutar una consulta de fila normal desde ASP.NET y realizar su pivote en el código de la aplicación. Si los datos son muy grandes, deberá generar el SQL dinámicamente después de consultar primero los posibles valores de columna.

Tenga en cuenta que en realidad no es necesario escribir una instrucción SQL que genere SQL dinámico; simplemente puede generar el SQL en ASP.NET, y eso será mucho más fácil. Simplemente no te olvides de escapar de los distintos valores Site antes de arrojarlos en una consulta generada, y no olvides parametrizar las partes de la declaración SQL que normalmente harías sin el pivote.

-1

seleccione el mes, min (sitio caso cuando 'fin val microsoft'then) Microsoft, min (sitio caso cuando' google'then final val) Google de withoutpivot grupo por mes

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' 
Cuestiones relacionadas