Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Ayuda group by x fecha¡¡¡ (https://www.clubdelphi.com/foros/showthread.php?t=67365)

Poke 13-04-2010 21:38:23

Ayuda group by x fecha¡¡¡
 
Hola a todos no sabía que título poner… tengo la siguiente duda sobre una consulta trabajo con zquery y firebird

Tengo una tabla apuntes con los siguientes campos
Apuntes:
Código
Categoría
Codcate
fechaA
Cargo
abono

Ahora realizo una consulta de la siguientes forma:
Código SQL
Código SQL [-]
select categoria, sum(cargo) as cargo1, sum(abono) as abono1 from apuntes group by categoria

Hasta ahí todo bien me devuelve la suma de todas las categoría pero ahora quiero hacer el mismo proceso pero de fecha ha fecha.. con el campo fecha que tengo en la tabla. Cualquier comentario me sería muy útil desde ya gracias…

Caral 13-04-2010 21:52:11

Hola
Tal vez.....
Código Delphi [-]
select categoria, sum(cargo) as cargo1, sum(abono) as abono1 from apuntes where FechaA >= :Fech1 And FechaA <= :Fech2 group by categoria
Saludos

Chris 13-04-2010 22:03:39

No se entiende de forma precisa lo que quieres. Puede ser algo cómo lo propuesto por caral, o bien hacer el GROUP BY usando un rango de fechas a cómo lo estás haciendo ahora con la Categoría.

Si es el segudo caso, puedes hacerlo ya sea cambiando en el SQL el campo Categoría por el de Fecha. Es tan sencillo que dudo que ésta sea tu inquietud :P

Puedes organizarlo por año, o bien por año y mes. Colocando una formula después del GROUP BY, exactamente en donde se encuentra "categoria". Creo que la formula para organizar por años es algo así:

Código SQL [-]
select ... GROUP BY (extract(year from Tabla.Fecha))

Espero te sirva.

Saludos,
Chris.

Poke 13-04-2010 22:14:24

Gracias x sus respuestas hago de la forma de caral pero nada ..
Código Delphi [-]
ZQueryc.Close;
ZQueryc.SQL.Clear;
ZQueryc.SQL.Add('select categoria, sum(cargo) as cargo1, sum(abono) as abono1 from apuntes');
ZQueryc.SQL.Add('where FechaA  between :Fech1 and :Fech2  group by categoria');
ZQueryc.ParamByName('fech1').DataType := ftdate;
ZQueryc.ParamByName('fech1').Value := strtodate('20/03/2010');
ZQueryc.ParamByName('fech2').DataType := ftdate;
ZQueryc.ParamByName('fech2').Value := strtodate('20/04/2010');
ZQueryc.Open;
Me sale error ¡¡ no reconoce el campo fecha es x que no la declaro en el select pero si la declaro no me sale el resultado que quiero… quiero que sume el cargo o abono de las categorías de x fecha a x fecha…
No se si me hago entender es que soy novato en estoo…

Caral 13-04-2010 23:21:12

Hola
La verdad no entiendo, yo lo haria asi:
Código Delphi [-]
ZQueryc.Close;
ZQueryc.SQL.Text:= 'select categoria, sum(cargo) as cargo1, sum(abono) as abono1 from apuntes'+
                   ' where FechaA  between :Fech1 and :Fech2  group by categoria';
ZQueryc.ParamByName('Fech1').Value := strtodate('20/03/2010');
ZQueryc.ParamByName('Fech2').Value := strtodate('20/04/2010');
ZQueryc.Open;
A ver....
Saludos

Poke 13-04-2010 23:36:12

Gracias x tu respuesta caral pero lo que tu planteas es lo mismo.. el error que me da es que no reconoce el campo fechaa para que funcione con el campo fecha debo ponerla en el select asi:


Código Delphi [-]
select fechaa, categoria, sum(cargo) as cargo1, sum(abono) as abono1 from apuntes
where FechaA  between :Fech1 and :Fech2  group by categoria, fechaa';

Pero al momento de agrupar me agrupan tb con el campo fecha. Y es lo que no quiero… mm no sé cómo hacerlo he buscado x el foro y no encuentro nada parecido.. mm a ver si me pueden ayudar…

Caral 13-04-2010 23:45:30

Hola
No se amigo Poke, lo lamento.
Saludos
PD: No te preocupes alguien te ayudara, no desistas.

Caro 15-04-2010 05:34:46

Hola poke, debería funcionarte colocando la condicion con fecha o cualquier otro campo en el Where aunque no lo pongas en el Select, ahora como tu dices si colocas en el Select también debes hacerlo en el Group By y te hara el agrupamiento por ese campo mas. Otra forma para hacer lo que quieres sería esta:

Hacemos una consulta por el rango de fechas y sobre ese resultado hacemos el group by, pero como te digo la otra forma también debería funcionarte:

Código SQL [-]
Select t.categoria, sum(t.cargo) as cargo1, sum(t.abono) as abono1
From (Select * From apuntes Where FechaA  between :Fech1 and :Fech2) t
Group By t.categoria

Saluditos

Poke 15-04-2010 20:52:59

Gracias caro x tu respuesta y gracias a caral.. Mira lo que tu planteas caro funciono perfectamente .. y lo que planteo caral igual, el error fue mio al momento de poner el campo fecha :D.. es que soy novato y ya tenía rato que no podía realizar esta consulta x eso de mis errores hora funciona perfectamente de las dos formas.. gracias de nuevo y sigan a delante… :)
Ahora tengo un problema con una consulta de transform y pivot… buscare haber que encuentro en el foro.. o lo planteare en otro hilo…. ¡¡??

AzidRain 15-04-2010 21:03:51

tambien puedes hacer Group by por varias condiciones, en tu caso se me ocurriria:

Código SQL [-]
  GROUP BY CATERGORIA, FECHA

O bien a la inversa segun como lo quieras ordenado. Mencionas que estas empezando te recomiendo "The MySQL Recibe Book" trae muchísimas "recetas" para realizar tareas concretas en MySQL explicadas con ejemplos y todo. Sirve bastante para irle entendiendo con casos prácticos como "Como obtener todas las filas que de una tabla que NO están en otra", y así...Para aprender es muy bueno y con los ejemplos puede uno ir practicando.

Poke 15-04-2010 23:16:52

Gracias AzidRain x tu recomendación me hace falta un libro de esos buscare a ver si lo encuentro..
Tengo un problemilla.. Quisiera saber si puedo restar los dos campos de cargo y abono.. y que el resultado me salga en un campo llamado total no se si se puede hacer mediante sql , tendria que salir asi:

categoria cargo abono total
alimentacion 23 0 -23



Mi idea.. y la idea que dan en otros hilos del foro es: aumentar un campo en mi tabla y cuando la consulta este echa recorrer toda la tabla he ir restando los campos y guardar el resultado en el campo total..

No sé si es una buena idea pero estoy dispuesto a escuchar opiniones….
Cualquier sugerencia es bienvenida desde ya graciasss…….

rgstuamigo 16-04-2010 00:44:01

Cita:

Empezado por Poke (Mensaje 360689)
...
Tengo un problemilla.. Quisiera saber si puedo restar los dos campos de cargo y abono.. y que el resultado me salga en un campo llamado total no se si se puede hacer mediante sql , tendria que salir asi:

categoria cargo abono total
alimentacion 23 0 -23
...

Si te estoy entendiendo bien lo que pretendes hacer :rolleyes:, tu consulta SQL sería:
Código SQL [-]
Select t.categoria, sum(t.cargo) as cargo1, sum(t.abono) as abono1,sum(t.cargo)-sum(t.abono) as total
From (Select * From apuntes Where FechaA  between :Fech1 and :Fech2) t
Group By t.categoria
.
Saludos...:)

Poke 16-04-2010 22:58:56

Hola de nuevo.. gracias por responder, lo puse como me planteaste rgstuamigo funciona .. pero en mi tabla existen registros null y al momento de realizar la resta me sale en blanco solo me resta cuando existes valores en los dos campos .. he buscado en los foros y encontré la función COALESCE para firebird y lo he puesto como comentan en los foros… asi:

Código SQL [-]
select categoria, COALESCE(sum(cargo),0) as cargo1 , COALESCE(sum(abono),0) as abono1, sum(cargo) - sum(abono) as total from apuntes 
 where Fecha  between :Fech1 and :Fech2  group by categoria

Y me sale error no reconoce la función COALESCE no sé qué estoy haciendo mal.. según ejemplos que encuentro en el foro debería funcionar.. Ahora si he revisado todo muy detenidamente :D a ver si me pueden ayudar..:o:o

PD. Utilizo firebird 2.1 y zeus

Poke 17-04-2010 14:43:58

¡¡¡solucionado!!
 
Mmm lo he solucionado..:) he estado con esto desde hace rato y lo he solucionado gracias a todos x sus aportes …. saludosss ;)


La franja horaria es GMT +2. Ahora son las 07:35:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi