vfp y sql server Unificar una consulta

99 views
Skip to first unread message

Douglas Sánchez

unread,
Sep 9, 2014, 12:38:05 AM9/9/14
to publice...@googlegroups.com
Hola que tal, colegas y amigos del foro,
Tengo una duda, estoy sacando información de un año completo de ventas pero esta consulta dilata demasiado, este es el codigo, ya que es un año completo, que trae hasta 4 años para comparar y me gustaria hacer una sola consulta en ves de 3.  

Esto lo hago en sql server.. text endtext

** Ventas contado y credito.
 SELECT codempresa, EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,
       SUM(ventas.total) as totalventas,
FROM   VENTAS
WHERE  (ventas.TIPO = 1 OR  VENTAS.TIPO = 2) AND
       DATEPART(yy,VENTAS.FECHA) = 2011
Group by VENTAS.CODEMPRSA

** las devoluciones para restarlas
SELECT codempresa, EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,
       SUM(ventas.total) as totalventas,
FROM   VENTAS
WHERE  ventas.TIPO = 3 AND  DATEPART(yy,VENTAS.FECHA) = 2011
Group by VENTAS.CODEMPRSA

** Esto ya lo hago en vfp

Select All * From tmpvtas Union Select All * From tmpdevo Into Cursor tmpres
Select codempresa, empresa, anio, Sum(totalventas) - Sum(totaldevo) As ventas_netas From tmpres Group By codempresa,anio Into Cursor tmpresult

Saludes y gracias de antemano.

Dsanchez

ZeRoberto

unread,
Sep 9, 2014, 12:59:27 AM9/9/14
to publicesvfoxpro
 SELECT codempresa, EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,
       SUM(ventas.total * IF(ventas.TIPO = 1 OR  VENTAS.TIPO = 2, 1, 0)) as TotalVentas,
      SUM(ventas.total * IF(ventas.TIPO = 3, 1, 0)) as Devoluciones
FROM   VENTAS
WHERE DATEPART(yy,VENTAS.FECHA) = 2011
Group by VENTAS.CODEMPRSA


Douglas Sánchez

unread,
Sep 9, 2014, 1:45:23 AM9/9/14
to publice...@googlegroups.com
Gracias Zroberto pero esa consulta me da error.

 SELECT tbventas.codigo,
       SUM(tbventas.monto  IF(tbventas.TIPO = 1 OR  tbventas.TIPO = 2, 1, 0)) as TotalVentas,
       SUM(tbventas.monto  IF(tbventas.TIPO = 3, 1, 0)) as Devoluciones
FROM  tbventas
group by tbventas.codigo

Saludes

--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

ZeRoberto

unread,
Sep 9, 2014, 9:28:48 AM9/9/14
to publicesvfoxpro
SELECT tbventas.codigo,
       SUM(tbventas.monto * IF(tbventas.TIPO = 1 OR  tbventas.TIPO = 2, 1, 0)) as TotalVentas,
       SUM(tbventas.monto * IF(tbventas.TIPO = 3, 1, 0)) as Devoluciones
FROM  tbventas
WHERE <<?>>
GROUP BY tbventas.codigo

Que error te sale? existe la funcion IF() o es IIF() como en el VFP

Saludos

Felipe Araoz Ramos

unread,
Sep 9, 2014, 9:40:54 AM9/9/14
to Foro-VFP
Hola Douglas

Te pongo como lo haria en postgresql, pero SQL server debe tener algo equivalente

** Todo ventas
 SELECT codempresa, EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,
       SUM(case when ventas.TIPO = 1 OR  then VENTAS.TIPO = 2 then ventas.total else ventas.total*-1 end  ) as totalventas,
FROM   VENTAS
WHERE   DATEPART(yy,VENTAS.FECHA) = 2011
Group by VENTAS.CODEMPRSA

Saludos

Felipe Araoz Ramos
RPM #941990605 / 941990605
RPC 992760385
NXT  822*9500 / 998229500

Felipe Araoz Ramos

unread,
Sep 9, 2014, 9:50:24 AM9/9/14
to Foro-VFP
PD
El group by deberia ser :
Group by VENTAS.CODEMPRSA, EMPRESA,anio 

de lo contrario no te va a funcionar.

Felipe Araoz Ramos
RPM #941990605 / 941990605
RPC 992760385
NXT  822*9500 / 998229500

Jose Manuel Urbaez Mendez

unread,
Sep 9, 2014, 9:54:28 AM9/9/14
to publice...@googlegroups.com
El error está en que en VFP no existe ese uso para el IF, en este caso debe ser SUM(tbventas.monto * IIF(tbventas.TIPO = 3, 1, 0)) as Devoluciones

ZeRoberto

unread,
Sep 9, 2014, 9:55:15 AM9/9/14
to publicesvfoxpro
Jose Manuel es para SQL Server

Saludos

Douglas Sánchez

unread,
Sep 9, 2014, 12:26:06 PM9/9/14
to publice...@googlegroups.com
Hola gracias por contestar,  intente hacer un case when pero me da error, es de sql server 2000?

Aunque no haga el sum pero si simplificar a una consulta en vfp lo hago con iif y todo bien y eso mismo me funciona en sql server 2012, pero 2000 nop.

** Ventas contado y credito.
 SELECT VENTAS.codempresa, VENTAS.EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,    ventas.total  as totalventas,
FROM   VENTAS
WHERE  (ventas.TIPO = 1 OR  VENTAS.TIPO = 2) AND
       DATEPART(yy,VENTAS.FECHA) = 2011


** las devoluciones para restarlas
SELECT VENTAS.codempresa, VENTAS.EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,  ventas.total as totalventas,
FROM   VENTAS
WHERE  ventas.TIPO = 3 AND  DATEPART(yy,VENTAS.FECHA) = 2011


Saludes  y gracias por las ideas.

Douglas


mpulla

unread,
Sep 9, 2014, 12:36:49 PM9/9/14
to publice...@googlegroups.com
Hola Daniel.

Para mí el problema de la demora está en el Where, FVP y Sql Server tratan de optimizar la consulta y al encontrarse con una función en el predicado no pueden optimizar la consulta por lo que hacen un barrido de toda la tabla, si la tabla tiene un índice por el campo fecha este Sql te puede ayudar.

SELECT codempresa, EMPRESA, DATEPART(yy, FECHA) as anio,
        SUM(total * Case  When TIPO = 1 OR  TIPO = 2 THEN 1 Else 0 end) As TotalVentas,
        SUM(total * Case  When TIPO = 3 THEN 1 Else 0 end) As Devoluciones
FROM   VENTAS
WHERE FECHA >= '20110101'
  And Fecha <= '20111231'
Group by codempresa, EMPRESA, DATEPART(yy, FECHA)

Saludos.
Mauricio

ZeRoberto

unread,
Sep 9, 2014, 2:00:32 PM9/9/14
to publicesvfoxpro
Al parecer ni el CASE no te va a servir en SQL Server 2000 por que se implemento desde el 2005


Saludos

Douglas Sánchez

unread,
Sep 9, 2014, 2:43:15 PM9/9/14
to publice...@googlegroups.com
Gracias Mauricio 

Pero me gustaria pegarlas estas dos consultas sin hacer sum en vfp me funciona bien con iif pero en sql server no funciona la version 2000

 SELECT VENTAS.codempresa, VENTAS.EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,    ventas.total  as totalventas,
FROM   VENTAS
WHERE  (ventas.TIPO = 1 OR  VENTAS.TIPO = 2) AND
       DATEPART(yy,VENTAS.FECHA) = 2011


** las devoluciones para restarlas
SELECT VENTAS.codempresa, VENTAS.EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,  ventas.total as totalventas,
FROM   VENTAS
WHERE  ventas.TIPO = 3 AND  DATEPART(yy,VENTAS.FECHA) = 2011

Saludes

Douglas

Víctor Hugo Espínola Domínguez

unread,
Sep 9, 2014, 3:08:25 PM9/9/14
to publice...@googlegroups.com
Hola Douglas

La función CASE existe en Sql server 2000: http://technet.microsoft.com/en-us/library/aa258235%28v=sql.80%29.aspx

Saludos,
Víctor.
Lambaré - Paraguay.

Felipe Araoz Ramos

unread,
Sep 9, 2014, 3:55:13 PM9/9/14
to Foro-VFP
Douglas

Viendo la pagina que publicó Victor,  asi te deberia funcionar

** Todo ventas
 SELECT codempresa, EMPRESA, DATEPART(yy,VENTAS.FECHA) as anio,
       SUM(CASE WHEN ventas.TIPO = 1 or ventas.TIPO = 2 THEN ventas.total 
                           WHEN ventas.TIPO = 3 THEN ventas.total*-1 END  ) as totalventas,
FROM   VENTAS
WHERE   DATEPART(yy,VENTAS.FECHA) = 2011
Group by VENTAS.CODEMPRSA, EMPRESA,anio 

en mi anterior mensaje habia un then demas, seguro por eso no funcionó
SUM(case when ventas.TIPO = 1 OR  then VENTAS.TIPO = 2 then ventas.total else ventas.total*-1 end  )

Felipe Araoz Ramos
RPM #941990605 / 941990605
RPC 992760385
NXT  822*9500 / 998229500

mpulla

unread,
Sep 9, 2014, 5:31:59 PM9/9/14
to publice...@googlegroups.com
Hola Douglas.


SELECT codempresa, EMPRESA, DATEPART(yy, FECHA) as anio,
        SUM(total * Case When Tipo = 1 OR  Tipo = 2 THEN 1
                                  When Tipo = 3 THEN - 1 end) As TotalVentas

mpulla

unread,
Sep 9, 2014, 5:43:34 PM9/9/14
to publice...@googlegroups.com
Hola Felipe.

El orden en que se ejecuta un select en Sql Server es:

FROM

WHERE

GROUP BY

HAVING

SELECT

Expressions

DISTINCT

ORDER BY

TOP / OFFSET-FETCH


Si ejecutas tu consulta y siguiendo el orden de ejecución, en Group by VENTAS.CODEMPRSA, EMPRESA, anio el campo anio todavía no existe y va a dar error.


Saludos.
Mauricio
Reply all
Reply to author
Forward
0 new messages