Idea con un SQL

199 views
Skip to first unread message

Edwin Duran

unread,
Oct 26, 2012, 9:34:30 PM10/26/12
to publice...@googlegroups.com
Saludos

Necesito de su ayuda para hace una consulta por rango, de los campos periodo y mes, esta es la consulta

select sum(monto) from tabla1 where periodo >= 2011 and pediodo <= 2012 and mes >= 10 and mes <= 10

que sucede que si en el 2011 tengo un monto que pertenece al mes 11 no lo trae, ya que no se encuentra entre el rango de condición de meses, alguna idea para solucionar esto,  he probado con mes >= 10 or mes <= 10, pero no me trae los resultados correctos.

Saludos
Edwin Duran

edgar suarez kummers

unread,
Oct 26, 2012, 9:46:06 PM10/26/12
to publice...@googlegroups.com
El menor o el mayor son frases logicas correctas.
El igual es para usarse en forma exclusiva.

Si algo va a ser mayor o igual a 10 puedes escribir apenas que sea mayor que 9.

Si algo va a ser mayor o igual a cero, puedes escribir mayor que -1

Si algo corresponde al mes de abril entonces escribes = 4

Tambien es bueno que coloques parentesis ...

Esto va sin tildes porque es un laptop que al escribirle la tilde queda antes de la letra.



Edwin Duran

--
 
 
 

Carlos Alfaro

unread,
Oct 26, 2012, 10:01:49 PM10/26/12
to publice...@googlegroups.com

Lo que tenés que hacer es unir los valores de periodo y mes; y compararlos con la unión de 2011 y 10, para ello los pasas a carácter.

 

select sum(monto) from tabla1 Where str(periodo,4) + replicate('0',2 - len(alltrim(str(mes)))) + alltrim(str(mes)) >= ‘201110’ .and. str(periodo,4) + replicate('0',2 - len(alltrim(str(mes)))) + alltrim(str(mes)) <= ‘201210’

 

Posiblemente hay una manera mas sencilla, pero esto fue lo que pensé.

 

Bendiciones.

 

Carlos Alfaro

--
 
 
 

mpulla

unread,
Oct 26, 2012, 11:49:21 PM10/26/12
to publice...@googlegroups.com

Hola Edwin.

Anexa un campo mas a tu tabla donde guardas  Año*100 + Mes (201210 para la fecha actual)

Select sum(monto) From Tabla Where iYM >= 201110 And iYM <= 201210

Saludos.
Mauricio

Walter R. Ojeda Valiente

unread,
Oct 27, 2012, 4:49:24 AM10/27/12
to publice...@googlegroups.com
No entiendo ¿qué es lo que quieres hacer?

Por supuesto que no te mostrará el mes 11 de 2011 porque está fuera de rango, en tu consulta le pides que te muestre solamente los datos del mes 10 de los años 2011 y 2012.

¿Acaso lo que quieres es que te muestre la suma de los montos entre Octubre 2011 y Octubre 2012? en ese caso sería:

SELECT SUM(MONTO) FROM TABLA1 WHERE (PERIODO = 2011 AND MES >= 10) OR (PERIODO = 2012 AND MES <= 10)

Aunque en este caso se procesará el mes 10 de ambos años.

Saludos.

Walter.





Date: Fri, 26 Oct 2012 18:34:30 -0700
From: edwinn...@gmail.com

To: publice...@googlegroups.com
Subject: [vfp] Idea con un SQL

--
 
 
 

Walter R. Ojeda Valiente

unread,
Oct 27, 2012, 5:22:57 AM10/27/12
to publice...@googlegroups.com
Edgar, es cierto lo que dices, aunque para la gran mayoría de las personas con experiencia en programación es más legible:

MES >= 10

que:

MES > 9

Y con  respecto a -1, es cierto siempre y cuando los números sean enteros, no se aplica para todos los números decimales porque:
-0.5 es mayor que -1 y es menor que 0

por lo tanto, no serviría como condición para los números que sean cero o mayores que cero.

Saludos.

Walter.





From: edgark...@gmail.com
Date: Fri, 26 Oct 2012 20:46:06 -0500
Subject: Re: [vfp] Idea con un SQL
To: publice...@googlegroups.com
--
 
 
 

Alejandro Isla

unread,
Oct 27, 2012, 7:20:12 AM10/27/12
to publice...@googlegroups.com
Hola, es imposible que te muestre el mes 11 debido a que en las condiciones del where pusiste "and mes <=10" es decir como 11 es > 10, te da .f. y no trae el registro.

Como bien te han preguntado ¿que quieres hacer?

La condición mes >=10 and mes <=10 solo admite (es equivalente) a mes = 10 para ser verdadera.

Saludos

Pablocpn

unread,
Oct 27, 2012, 8:51:47 AM10/27/12
to publice...@googlegroups.com
Saludos al foro, k me divierte todos lo dias.
Si la interpretacion exacta de Walter a tu consulta es correcta, la solucion ya te la dio.
Pero no va a resultar si tu rango abarca mas de 2 años, por ejemplo de 2010.10 a 2012.10 el select podria ser el k sigue...

SELECT SUM(monto) FROM tabla1 WHERE periodo*100+mes>=201010 and periodo*100+mes<=201210

Claro puedes usar betwen(.... Si gustas

Saludos a todos los del foro
Ojala no este equivocada mi respuesta...

Debora

Edwin Duran

unread,
Oct 27, 2012, 10:02:25 AM10/27/12
to publice...@googlegroups.com
Gracias a todos por su ayuda lo solucione de la siguiente manera


select sum(monto) from tabla1 where (periodo+(mes/100) >= 2011.10) and (pediodo+(mes/100) <= 2012.10

Edward Cifuentes

unread,
Oct 27, 2012, 10:03:21 AM10/27/12
to publice...@googlegroups.com
Sera esto lo que necesitas

anoini= 2011
anofin= 2012
mesini=10
mesfin=10

SELECT SUM(MONTO) FROM TABLA1 WHERE (PERIODO >= anoini AND MES >= mesini) AND (PERIODO< = anofin AND MES <= fin)








--




Edward Cifuentes

unread,
Oct 27, 2012, 10:09:01 AM10/27/12
to publice...@googlegroups.com
correccion

SELECT SUM(MONTO) FROM TABLA1 WHERE (PERIODO >= anoini AND MES >= mesini) AND (PERIODO< = anofin AND MES <= mesfin)

Edwin Duran

unread,
Oct 27, 2012, 10:44:22 AM10/27/12
to publice...@googlegroups.com
Gracias por tu ayuda pero de esa forma no funciona por ejemplo:

año              mes
2011             10
2011             11
2012             02
2012             10

si busco del 2011 del mes 10 al 2012 del mes 10, fíjate que el 2012 del mes 02 no cumple la primera condición  en el mes (PERIODO >= anoini AND MES >= mesini)

Saludos

Edward Cifuentes

unread,
Oct 27, 2012, 10:48:14 AM10/27/12
to publice...@googlegroups.com
Pense que necesitabas un rango de un año desde el mes de agosto hasta el otro mes de agotso

pero ya entendi lo que quieres es hacer un comparativo entre un mes y un año en especial

Quedaria asi si solo quieres agsoto del 2011 y agosto de 2012


SELECT SUM(MONTO) FROM TABLA1 WHERE (PERIODO = anoini AND MES = mesini) AND (PERIODO = anofin AND MES = mesfin)




--
 
 
 

Edward Cifuentes

unread,
Oct 27, 2012, 10:51:44 AM10/27/12
to publice...@googlegroups.com
correccion

SELECT SUM(MONTO) FROM TABLA1 WHERE (PERIODO = anoini AND MES = mesini) OR (PERIODO = anofin AND MES = mesfin)

Edwin Duran

unread,
Oct 27, 2012, 11:00:30 AM10/27/12
to publice...@googlegroups.com
no es un comparativo, es buscar en ese rango

Guillermo MDQ

unread,
Oct 27, 2012, 11:04:52 AM10/27/12
to publice...@googlegroups.com
Tambien podrias agregarle un campo a la tabla con el año y el mes (ej: 201010) y te resultara mas rapidas y mas faciles las consultas, ya que lo puedes solucionar con un BETWEEN.

Saludos
Guillermo

mpulla

unread,
Oct 27, 2012, 11:32:20 AM10/27/12
to publice...@googlegroups.com

Hola Edwin.

En lo personal prefiero gastarme 4 bytes (x registro) almacenándolos, que hacer la conversión (periodo+(mes/100) >= 2011.10) and (periodo+(mes/100)) de una tabla de varios cientos de miles por consulta.

Existe otras soluciones ya depende de como tengas tu db.

En mi respuesta anterior ya te mencione esto, pruébalo

CREATE CURSOR rs (iPeriodo I, iMes I, iYM I DEFAULT iPeriodo * 100 + iMes)
FOR i = 2010 TO 2012
    FOR j=1 TO 12
        INSERT INTO rs (iPeriodo, iMes) VALUES (i, j)       
    NEXT j
NEXT i

SELECT * FROM rs WHERE iYM between 201110 AND 201210

Saludos.
Mauricio

Luis Maria Guayan

unread,
Oct 27, 2012, 11:34:41 AM10/27/12
to publice...@googlegroups.com
Para trabajar con rango de fechas siempre es mejor tener datos de Fecha, en tu caso que tienes separado el periodo y el mes, debes combinarlo para que tu condición quede de la forma:

... TRANSFORM(periodo, "@L 9999")+TRANSFORM(Mes, "@L 99")
BETWEEN "201110" AND "201211" ...

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

Alberto Tapia Gómez

unread,
Nov 10, 2012, 11:47:40 AM11/10/12
to publice...@googlegroups.com
a ver si entiendo,  necesitas periodo 2011 y 2012 además entre Octubre y Octubre, o sea Oct de 2011 a Dic 2011 y enero 2012 a oct 2012 ( la lógica sería)
(periodo = 2011 and (mes>=10 and mes <=12))  or (periodo = 2012 and (mes>=1 and mes <=10)).... lo probé y me funcionó .... ojalá te sirva
Talo de Chile

Jose Mario

unread,
Nov 14, 2012, 11:20:17 AM11/14/12
to publice...@googlegroups.com
perdon mpulla
la instruccion
 iYM I DEFAULT iPeriodo * 100 + iMes
esta instruccion es para motor de base
o para vfp 9 por ejemplo
no entiendo que hace
perdona mi ignorancia

mpulla

unread,
Nov 14, 2012, 11:51:44 AM11/14/12
to publice...@googlegroups.com

Hola José

Solo pregunta, no digas "perdona mi ignorancia"

iYM es el nombre de un campo cuyo valor por defecto iPeriodo * 100 + iMes, entonces para insertar un registro en el cursor de ejemplo tendrías que hacer

insert Into Rs (iPeriodo, iMes) Values (2012, 1)

El valor para el campo iYM seria 201201, este campo me ayuda a simplificar el Where

SELECT * FROM rs WHERE iYM between 201110 AND 201210

Caso contrario tendrías que hacer algo como lo que recomienda Alberto.


(periodo = 2011 and (mes>=10 and mes <=12))  or (periodo = 2012 and (mes>=1 and mes <=10))

Como vez la creación de este campo es para apoyarte y simplificar las cosas.

Saludos.
Mauricio


Zorrro

unread,
Nov 14, 2012, 1:49:46 PM11/14/12
to publice...@googlegroups.com
Yo agruparia asi para mostrar suma por mes, segun inteprete el rango de las fechas:

SELECT SUM(MONTO) sumamonto,STRZERO(PERIODO,4)+STRZERO(MES,2) PER FROM TABLA1 WHERE VAL(STRZERO(PERIODO,4)+STRZERO(MES,2)) BETW 201110 AND 201210 GROUP BY PER

Para la funcion strzero es:

Para pNum,pNZ
Return Replicate("0",pNZ-Len(Ltrim(Str(pNum))))+Ltrim(Str(pNum))
Endfunc

Zorrro

unread,
Nov 14, 2012, 1:54:15 PM11/14/12
to publice...@googlegroups.com
O como dice Luis Maria usando Transform:

SELECT SUM(MONTO) sumamonto,TRANSFORM(periodo, "@L 9999")+TRANSFORM(Mes, "@L 99") PER FROM TABLA1 WHERE TRANSFORM(periodo, "@L 9999")+TRANSFORM(Mes, "@L 99") BETWEEN "201110" AND "201211"GROUP BY PER


Saludos


El viernes, 26 de octubre de 2012 20:34:30 UTC-5, Edwin Duran escribió:

Walter R. Ojeda Valiente

unread,
Nov 14, 2012, 2:25:36 PM11/14/12
to publice...@googlegroups.com
En lugar de usar tu función STRZERO() es más fácil usar la función PADL() que viene incluida con el Visual FoxPro.

? PADL(345, 7, "0")

Saludos.

Walter.

"Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House




Date: Wed, 14 Nov 2012 10:49:46 -0800
From: robe...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Idea con un SQL
--
 
 
 

ZeRoberto

unread,
Nov 14, 2012, 3:06:00 PM11/14/12
to publice...@googlegroups.com
O talvez

TransForm(lnNumero, "@L " + Replicate("0", lnLargo))


El 14/11/12, Walter R. Ojeda Valiente <wr...@hotmail.com> escribió:
>
> En lugar de usar tu función STRZERO() es más fácil usar la función PADL()
> que viene incluida con el Visual FoxPro.
>
> ? PADL(345, 7, "0")
>
> Saludos.
>
> Walter.
>
> "Si puedes razonar con gente religiosa, no son gente religiosa". Dr. House
>
>
>
> --
>
>
>
>
Reply all
Reply to author
Forward
0 new messages