Sql dinamica para generar consulta crosstab

tema enviado por Kayser en SQL Server
tema iniciado el 08/06/2010
Hola a todos tengo un problema con un procedimiento almacenado para generar resultado tipo Crosstab. Resulta que no puedo pasar los parametros que me pide el procedimiento, este procedimiento lo saque de internet y no he podido ver bien como se ocupa. Mi tabla a ocupar se llama TEMP con campos RAzonsocial,rut,concepto,monto. El Procedimiento es el sgte: USE [Desarrollo]; GO SET ANSI_NULLS OFF; GO SET QUOTED_IDENTIFIER OFF; GO CREATE PROCEDURE [dbo].[PR_crosstab] @TABLA varchar(255), @PIVOT VARCHAR(255), @AGRUPACION varchar(255), @CAMPO varchar(255), @CALCULO varchar(20), @CONDICION varchar(255), @ORDEN varchar(255) AS --Declaramos las variables que nos permitirán crear el sql con los "CASES" DECLARE @STRG AS VARCHAR(8000) DECLARE @SQL AS VARCHAR(8000) CREATE TABLE #PIVOT ( PIVOT VARCHAR (8000) ) -- limpiamos las variables por si a caso SET @STRG='' SET @SQL='' -- ALMA MATTER DEL PIVOT TABLE /* En el siguiente código realizamos un "select distinct" del campo que usaremos como pivote, a cada registro le concatenamos su correspondiente "CASE" y lo almacenamos en una tabla temporal llamada #PIVOT */ SET @STRG=@STRG + 'INSERT INTO #PIVOT SELECT DISTINCT ''' + @CALCULO + '(CASE WHEN ' + @PIVOT + '=''''''+ RTRIM(CAST(' + @PIVOT + ' AS VARCHAR(500))) + '''''' THEN ' + @CAMPO + ' ELSE NULL END) AS ''''' + @CALCULO + '_'' + RTRIM(CAST(' + @PIVOT + ' AS VARCHAR(500))) + '''''', '' AS PIVOT FROM ' + @TABLA + ' WHERE ' + @PIVOT + ' IS NOT NULL AND' +@CONDICION EXECUTE (@STRG) /* --el sql dinámico de más arriba genera un script similar a éste, -- (cambia según los parámetros que se ingresen) INSERT INTO #PIVOT SELECT DISTINCT 'AVG(CASE WHEN campo_pivote=''' + RTRIM(CAST(campo_pivote AS VARCHAR(500))) + ''' THEN precio ELSE 0 END) AS ''' + RTRIM(CAST(campo_pivote AS VARCHAR(500))) + ''',' AS PIVOT FROM tu_tabla WHERE campo_pivote IS NOT NULL --Con el cual se obtienen los valores de los registros que queremos que se conviertan en campos de nuestra nueva tabla. --A continuación generamos la consulta final, donde seleccionamos las columnas según la tabla #PIVOT y realizamos la agrupación correspondiente. */ SET @SQL ='SELECT ' SELECT @SQL= @SQL + RTRIM(convert(varchar(500), pivot)) FROM #PIVOT ORDER BY PIVOT IF @AGRUPACION<>'*' BEGIN SET @SQL=@SQL + @AGRUPACION + ' FROM ' + @TABLA + ' GROUP BY ' + @AGRUPACION END ELSE BEGIN SET @SQL=@SQL + '''TODOS'' AS T FROM ' + @TABLA END /* Ejecutamos la consulta, si quieres ver como queda, cambia el: EXECUTE(@SQL) por PRINT(@SQL) */ EXECUTE (@SQL) /* OJO: Si la consulta resultante en @SQL tiene más de 8000 caracteres el script dará un error ya que el sql no quedará completo . */ -- FIN DE SP GO