Ver Mensaje Individual
  #16 (permalink)  
Antiguo 19/01/2007, 09:52
Avatar de charlyrosero
charlyrosero
 
Fecha de Ingreso: julio-2006
Mensajes: 161
Antigüedad: 17 años, 9 meses
Puntos: 5
Re: solucion a Cross table de Maestros del Web

Ok , esta es la solucion al problemilla , cabe destacar que estre procedimiento hace 2 pivots.

esta probado en el Query Analizer, pero se puede convertir en Store
Procedure Con solo aumentar estas lineas

Código:
CREATE PROCEDURE Cross_table 
--Creamos el procedimiento almacenado.
@TABLA varchar(255),
@PIVOT  VARCHAR(255),
@AGRUPACION varchar(255),
@CAMPO varchar(255),
@CAMPO2  VARCHAR(255),
@CALCULO varchar(20)
AS

y se suprimirria las asignaciones en el siguiente codigo
Código:
DECLARE @TABLA varchar(255)
DECLARE @PIVOT  VARCHAR(255)
DECLARE @AGRUPACION varchar(255)
DECLARE @CAMPO varchar(255)
DECLARE @CAMPO2  VARCHAR(255)
DECLARE @CALCULO varchar(20)
DECLARE @STRG AS VARCHAR(8000) 
DECLARE @SQL1 AS  VARCHAR(200)
DECLARE @SQL2 AS  VARCHAR(8000)
DECLARE @SQL3 AS  VARCHAR(8000)
DECLARE @SQL4 AS  VARCHAR(2000)
DECLARE @CANT_REG AS INT
DECLARE @LIMIT AS INT


SET @TABLA='[Ventas Comerciales Regulares OPT]'
SET @PIVOT='LN'
SET @AGRUPACION ='[CODIGO VENDEDOR],VENDEDOR,NIT,CLIENTE,SUCURSAL,CANAL,[CLASE CLIENTE],DIRECCION,TELEFONO,BARRIO_V,CIUDAD,SUBCATEGORIA'
SET @CAMPO='UN'
SET @CAMPO2='T'
SET @CALCULO ='SUM'

CREATE TABLE #PIVOT (IdRow integer IDENTITY(1,1) , PIVOTE VARCHAR (6000))
-- limpiamos las variables por si a caso

SET @STRG='' 
SET @SQL1=''
SET @SQL2=''
SET @SQL3=''
SET @SQL4=''

---ejecutamos el primer PIVOT el cual suma cantidades

SET @STRG=@STRG+ 'INSERT INTO #PIVOT (PIVOTE ) SELECT DISTINCT ''' +','+@CALCULO + ' (CASE WHEN ' + @PIVOT +' = '''''' + RTRIM(CAST(' + @PIVOT + ' AS VARCHAR(200))) +''''''  THEN ' + @CAMPO + '  ELSE 0  END)  AS '+  ''''''' +   RTRIM(CAST(' + @PIVOT + ' AS VARCHAR(200))) +''''''''   FROM ' + @TABLA + ' WHERE ' + @PIVOT + ' IS NOT NULL '
EXECUTE (@STRG) 

--ejecutamos el segunto PIVOT el cual suma Cantidades monetarias

SET @STRG= 'INSERT INTO #PIVOT (PIVOTE)  SELECT DISTINCT ''' +','+@CALCULO + ' (CASE WHEN ' + @PIVOT +' = '''''' + RTRIM(CAST(' + @PIVOT + ' AS VARCHAR(200))) +''''''  THEN ' + @CAMPO2 + '  ELSE 0  END)  AS '+'''''$ ''+'''' +  RTRIM(CAST(' + @PIVOT + ' AS VARCHAR(200))) +''''''''   FROM  ' + @TABLA + ' WHERE ' + @PIVOT + ' IS NOT NULL '
EXECUTE (@STRG) 



---HALLAMOS LA CANTIDAD TOTAL DE REGISTROS,  PARA DIVIDIRLOS POR 2 Y ASI CALCULAR EL SQL
SELECT  @CANT_REG= COUNT(*) FROM #PIVOT 

--HALLAMOS EL LIMITE DE REGISTROS
SET @LIMIT = @CANT_REG  /  2

--A CONTINUACION REALIZAMOS LAS CONSULTAS SQL CON LAS LIMITANTES

SET @SQL1= 'SELECT ' + @AGRUPACION 

SET @SQL2=''
SELECT @SQL2= @SQL2 + RTRIM(CONVERT(VARCHAR (500), PIVOTE)) 
FROM #PIVOT 
WHERE IdRow <= @LIMIT

SET @SQL3=''
SELECT @SQL3=@SQL3 +  RTRIM(CONVERT(VARCHAR (500), PIVOTE)) 
FROM #PIVOT 
WHERE IdRow > @LIMIT

SET @SQL4=''
SET @SQL4=@SQL4 + ' FROM ' + @TABLA + 'GROUP BY ' + @AGRUPACION + ' ORDER BY ' + @AGRUPACION

EXEC (@SQL1+@SQL2+@SQL3+@SQL4)


GO
se me olvidaba agradecer a Andres por su aporte con este problema !!

Gracias Daniel !!

Última edición por charlyrosero; 16/04/2007 a las 08:36