Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/09/2014, 21:01
Avatar de hhelmanj
hhelmanj
 
Fecha de Ingreso: julio-2014
Ubicación: Santiago de Chile
Mensajes: 10
Antigüedad: 10 años, 5 meses
Puntos: 0
Consulta SQL con PIVOT DINAMICO desde PHP

Estimados,

Estuve "trabajando" (copie, pegue un trabaje un poco...) en esta consulta:
Código SQL:
Ver original
  1. DECLARE @A INT, @YearsPVT NVARCHAR(MAX)
  2.  
  3. DECLARE @Desde NVARCHAR(50), @Hasta NVARCHAR(50)
  4.  
  5. SET @Desde=N'2014-09-01'
  6. SET @Hasta=N'2014-09-03'
  7.  
  8. DECLARE @TableYears AS TABLE([A] INT NOT NULL)
  9. INSERT INTO @TableYears SELECT DISTINCT DAY(fecdoc) AS [A] FROM tve WHERE fecdoc BETWEEN @Desde AND @Hasta
  10. SET @A=(SELECT MIN([A]) FROM @TableYears)
  11. SET @YearsPVT=N''
  12. WHILE @A IS NOT NULL
  13. BEGIN
  14.   SET @YearsPVT=@YearsPVT+N',['+CONVERT(NVARCHAR(10),@A)+N']'
  15.   SET @A=(SELECT MIN([A]) FROM @TableYears WHERE [A]>@A)
  16. END
  17. SET @YearsPVT=SUBSTRING(@YearsPVT,2,LEN(@YearsPVT))
  18. PRINT @YearsPVT
  19. DECLARE @SQL NVARCHAR(MAX)
  20.  
  21. DECLARE @WHERE NVARCHAR(MAX)
  22.  
  23. SET @WHERE=N'
  24.  
  25. SET @SQL= N'SELECT *
  26.             FROM (
  27.                 SELECT tve.idbodega,bodegas.bodega, DAY(fecdoc) [A] ,total FROM tve
  28.                 INNER JOIN bodegas ON tve.idbodega=bodegas.idbodega
  29.                 [U][B]WHERE fecdoc BETWEEN "2014-09-01" AND "2014-09-03" AND tve.idbodega="7"[/B][/U]
  30.                 ) pvt
  31.             PIVOT (SUM(total) FOR [A] IN ('+@YearsPVT+')) AS Child
  32.             ORDER BY idbodega'
  33. EXECUTE sp_executesql @SQL

El codigo en negrita, en realidad me gustaria completarlo con variables PHP.

Esta consulta echa directo en la base de datos FUNCIONA.

cuando la guardo en una variable de PHP y la llamo....:
Código PHP:
Ver original
  1. $TxtConsulta="DECLARE @A INT, @YearsPVT NVARCHAR(MAX)
  2. DECLARE @TableYears AS TABLE([A] INT NOT NULL)
  3. INSERT INTO @TableYears SELECT DISTINCT DAY(fecdoc) as [A] FROM tve where fecdoc between '$fecha_desde_epos' and '$fecha_hasta_epos'
  4. SET @A=(SELECT MIN([A]) FROM @TableYears)
  5. SET @YearsPVT=N''
  6. WHILE @A IS NOT NULL
  7. BEGIN
  8.  SET @YearsPVT=@YearsPVT+N',['+CONVERT(NVARCHAR(10),@A)+N']'
  9.  SET @A=(SELECT MIN([A]) FROM @TableYears WHERE [A]>@A)
  10. END
  11. SET @YearsPVT=SUBSTRING(@YearsPVT,2,LEN(@YearsPVT))
  12. PRINT @YearsPVT
  13. DECLARE @SQL NVARCHAR(MAX)
  14. SET @SQL=N'SELECT *
  15.            FROM (
  16.                SELECT tve.idbodega,bodegas.bodega, DAY(fecdoc) [A] ,total FROM tve
  17.                inner join bodegas on tve.idbodega=bodegas.idbodega
  18.                where fecdoc between \"$fecha_desde_epos\" and \"$fecha_hasta_epos\"
  19.                ) pvt
  20.            PIVOT (SUM(total) FOR [A] IN ('+@YearsPVT+')) AS Child
  21.            ORDER by idbodega'
  22. EXECUTE sp_executesql @SQL";

Última edición por gnzsoloyo; 16/09/2014 a las 08:06