Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta simple y con sumas (https://www.clubdelphi.com/foros/showthread.php?t=77517)

MartinS 03-02-2012 14:03:08

Consulta simple y con sumas
 
Hola gente!!!. A medida que voy progresando en el desarrollo de una aplicación para personal aparecen dudas sobre las consultas que debo realizar en SQL ya que hace muy poco que empece con Firebird. :D

Hoy el tema es el siguiente: Una de mis tablas llamada inasistencias registra eso "Inasistencias" y lo que debo realizar es el calculo de los días que ha faltado el personal. Los campos de dicha tabla son

Id, IdAgente, Fecha, Periodo, Tipo, FaltaJust, FaltaInj, TardeJust, TardeInj y Observaciones

La idea es que seleccionando el agente me liste las veces que ha faltado. Hasta ahi todo bien:

Código Delphi [-]
 With Filtro do
  Begin
    Close;
    SQL.Clear;
    SQL.Add('Select * From Inasistencias Where Fecha >= :FDesde and Fecha <=:FHasta and IDAGente = :Cod');
    SQL.Add('Order By Fecha');
    ParamByName('FDesde').Value := Desde.DateTime;
    ParamByName('FHasta').Value := Hasta.DateTime;
    ParamByName('Cod').Value := CodigoAgente;
    Open;
  End;

El tema es que ademas necesito que en la barra de estado (StatusBar) me de el total (suma por separado) de cada tipo de inasistencia TardeJust,TardeInj,FaltaJust y FaltaInj.

Filtro es un IBQuery y los campos que necesito sumar contiene la cantidad de días que han faltado o llegado tarde.

Gracias y saludos.-

Neftali [Germán.Estévez] 03-02-2012 15:08:30

Prueba a utilizar la función SUM(campo1), SUM(campo2) en la parte de los campos de la sentencia SQL.
En tu caso si los campos donde anotas las faltas ya contienen el entero con los día, eso debería devolver el resultado.

Al final un GROUP BY por el ID y te debería devolver las sumas...

Código SQL [-]
SELECT ID, SUM(FaltaJust), SUM(FaltaInj), SUM(TardeJust), SUM(TardeInj) FROM...
...
GROUP BY ID

Échale un vistazo a la ayuda sobre el SUM o buscas en los foros y encontrarás más ejemplos para acabar de entenderlo.

MartinS 03-02-2012 16:39:17

Hola Neftali: Gracias por la respuesta. Ahora bien, me surge un inconveniente ya que si agrupo no veo el detalle y si listo no veo los totales :p Hay alguna forma de conbinar las dos sentencias SQL en una sola??

Código Delphi [-]
  With Filtro do
  Begin
    Close;
    SQL.Clear;
    SQL.Add('Select * From Inasistencias Where IdAgente = :Cod');
    SQL.Add('Order By Fecha');
    ParamByName('Cod').AsInteger := CodigoAgente;
    Open;
  End;
  With Calculo do
  Begin
    Close;
    Sql.Clear;
    Sql.Add('Select IdAgente, Sum(TardeJust) as TJ, Sum(TardeInj) As TI, Sum(Faltajust) As FJ, Sum(FaltaInj) as FI From Inasistencias Where IdAgente = :Cod');
    Sql.Add('Group by IdAgente');
    ParamByName('Cod').AsInteger := CodigoAgente;
    open;
  End;
  StatusBar1.Panels[1].Text := IntToStr(Calculo.FieldByName('FJ').AsInteger);
  StatusBar1.Panels[3].Text := IntToStr(Calculo.FieldByName('FI').AsInteger);
  StatusBar1.Panels[5].Text := IntToStr(Calculo.FieldByName('TJ').AsInteger);
  StatusBar1.Panels[7].Text := IntToStr(Calculo.FieldByName('TI').AsInteger);

Gracias nuevamente... :D

Caral 03-02-2012 17:32:35

Hola
Tal vez asi:
Código Delphi [-]
With Filtro do
  Begin
    Close;
    SQL.Text:= 'Select Id, IdAgente, Fecha, Periodo, Tipo, FaltaJust, FaltaInj, TardeJust, TardeInj, Observaciones '+
               '(Select IdAgente, Sum(TardeJust) as TJ, Sum(TardeInj) As TI, Sum(Faltajust) As FJ, Sum(FaltaInj) as FI) '+
               ' From Inasistencias Where IdAgente = :Cod '+
               ' Group by IdAgente';
    ParamByName('Cod').AsInteger := CodigoAgente;
    Open;
  End;
  StatusBar1.Panels[1].Text := IntToStr(Filtro.FieldByName('FJ').AsInteger);
  StatusBar1.Panels[3].Text := IntToStr(Filtro.FieldByName('FI').AsInteger);
  StatusBar1.Panels[5].Text := IntToStr(Filtro.FieldByName('TJ').AsInteger);
  StatusBar1.Panels[7].Text := IntToStr(Filtro.FieldByName('TI').AsInteger);
Saludos

Neftali [Germán.Estévez] 03-02-2012 19:38:48

O si necesitas ambas cosas, tal vez debas hacer 2 consultas separadas, pero no me queda claro qué es exactamente lo que necesitas.

MartinS 04-02-2012 02:54:34

Cita:

Empezado por Neftali (Mensaje 424235)
O si necesitas ambas cosas, tal vez debas hacer 2 consultas separadas, pero no me queda claro qué es exactamente lo que necesitas.

Si, Necesito ambas cosas. En el form hay un dbgrid donde se lista por fechas las veces que ha faltado y en el Status bar dividido en paneles donde se muestra la suma de cada llegada tarde y falta. En el codigo que presente después del primer mensaje hice como decis, 2 consultas separadas (filtro para lista y calculo para sumas - ambos Ibquery) pero quería saber si se puede expresar en una sola. Me queda probar lo del amigo Caral y veremos si funciona si no me quedo con las 2 consultas.-

Saludos

Neftali [Germán.Estévez] 06-02-2012 10:46:22

Creo que no, salvo cosas raras, porque piensa que en una consulta necesitas TODOS los datos, y en la otra justo lo que necesitas es eliminar "datos superfluos" para quedarte con las agrupaciones (suma de horas/cantidades).

MartinS 06-02-2012 13:08:23

Solucionado!
 
Me quedo con las 2 consultas separadas. Probé la opción de Caral pero me da error en el segundo select. En definitiva no se si haciendo las 2 consultas es lo mas elegante pero en algún lado de este foro también vi:

-Si funciona para que reprogramarlo!!! :D

Saludos y gracias por su tiempo y su predisposición.


La franja horaria es GMT +2. Ahora son las 23:35:50.

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