Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda problema con group by (https://www.clubdelphi.com/foros/showthread.php?t=73702)

Rofocale 11-05-2011 03:14:05

ayuda problema con group by
 
Código Delphi [-]
   if(chkFecha.Checked) then
     begin
               dmDatos.cdsCliente.Active := false;
                with dmDatos.qryListados do begin
                if Active then Close;
                SQL.Clear;
                SQL.Add('SELECT f.caja,f.numero,f.fecha,f.hora,f.estatus,f.total-f.iva AS subtotal,f.iva,f.total,f.cliente,f.clave,sum(f.total) AS gtotal FROM ventas f WHERE f.fecha = :fecha GROUP BY f.caja,f.numero,f.fecha,f.hora,f.estatus,f.iva,f.total,f.cliente,f.clave');
                parambyname('fecha').AsDate := FechaBusq.date;
                open;
                end;

            with dmDatos.cdsCliente do begin
            Active := true;
            txtTotalventa.text := floattostr(FieldByName('gtotal').AsFloat);
            txtRegistros.text := inttostr(dmDatos.cdsCliente.RecordCount);
            FieldByName('caja').DisplayLabel := 'Caja';
            FieldByName('caja').DisplayWidth := 4;
            FieldByName('numero').DisplayLabel := 'Remisión';
            FieldByName('numero').DisplayWidth := 8;
            FieldByName('fecha').DisplayLabel := 'Fecha';
            FieldByName('fecha').DisplayWidth := 9;
            FieldByName('hora').DisplayLabel := 'Hora';
            FieldByName('hora').DisplayWidth := 11;
            FieldByName('estatus').DisplayLabel := 'Estatus';
            FieldByName('estatus').DisplayWidth := 7;
            FieldByName('subtotal').DisplayLabel := 'Subtotal';
            FieldByName('subtotal').DisplayWidth := 10;
           // (FieldByName('subtotal') as TNumericField).DisplayFormat := '#,##0.00';
            FieldByName('iva').DisplayLabel := 'IGV';
            FieldByName('iva').DisplayWidth := 10;
           // (FieldByName('iva') as TNumericField).DisplayFormat := '#,##0.00';
            FieldByName('total').DisplayLabel := 'Total';
            FieldByName('total').DisplayWidth := 10;
           // (FieldByName('total') as TNumericField).DisplayFormat := '#,##0.00';
            FieldByName('cliente').Visible := false;
          //  FieldByName('usuario').Visible := false;
            FieldByName('clave').Visible := False;
            FieldByName('gtotal').Visible := False;
           end;
    end
hola a todos este codigo utilizo para filtrar registros de una base de datos.. pero la parte sum(total) no me suma solo me devuelve el resultado del primer registro

Código Delphi [-]
SQL.Add('SELECT sum(f.total) AS gtotal FROM ventas f WHERE f.fecha = :fecha')

ese codigo filtra por fecha y me devuelve bien la suma de todos los registros de tal fecha

jose 2.5 05/05/2011
maria 2.5 05/05/2011
carla 1.0 06/05/2011

si lo filtro por fecha 5 solo sale en un text el total de gtotal que seria 5

todo bien ahi ahora como veran no solo necesito la suma del total en un edit si no que tmb me muestre el filtrado asi

jose 2.5 05/05/2011
maria 2.5 05/05/2011

ahora implemento el codigo asi

Código Delphi [-]
QL.Add('SELECT f.caja,f.numero,f.fecha,f.hora,f.estatus,f.total-f.iva AS subtotal,f.iva,f.total,f.cliente,f.clave,sum(f.total) AS gtotal FROM ventas f WHERE f.fecha = :fecha')

y como aumente todos los campos que se necesita para que se muestre ahora aparte de en un edit el total tambien en un GRID
me sale que necesito un group by clause

Código Delphi [-]
SQL.Add('SELECT f.caja,f.numero,f.fecha,f.hora,f.estatus,f.total-f.iva AS subtotal,f.iva,f.total,f.cliente,f.clave,sum(f.total) AS gtotal FROM ventas f WHERE f.fecha = :fecha GROUP BY f.caja,f.numero,f.fecha,f.hora,f.estatus,f.iva,f.total,f.cliente,f.clave');

lo implemento asi y me filtra bien me muestra los resultados si filtro por fecha 05/05/211 esto

jose 2.5 05/05/2011
maria 2.5 05/05/2011


pero en el edit me sale solo 2.5


ese es mi problema que ahora ya no me suma el total, creo que estoy haciendo algo mal con el group by

necesito que me ayuden porfavor muchas gracias de antemano

Caral 11-05-2011 03:19:31

Hola
No entiendo bien el problema, pero si fuera el group by daria error, no resultados equivocados.
Me parece.
Saludos

Rofocale 11-05-2011 03:52:32

quisiera saber porque no funciona el sum(total) porque no suma todos los registros.. que estare haciendo mal ?

Caral 11-05-2011 04:34:28

Hola
En base a mi poca experiencia:
Aveces dependiendo de la base de datos, para que la suma sea la que uno requiere se necesita definir algunos parametros adicionales como podrian ser, distinct, max, min, etc.
Los registros son secuenciales, eso quiere decir que ocupan toda la linea, si se quiere hacer una suma sobre todo total, se necesita hacer una distincion para que se defina correctamente el dato.
No creo que te pueda ayudar mucho, pero por lo menos ponemos la duda en la primera fila.
Saludos

identsoft 11-05-2011 10:38:38

Cuando haces un Sum(algo), este Sum te lo hace de los campos que le digas en group by. Si especificas muchos campos en group by, la instruccion Sql no da error, pero no saca el resultado que esperamos.
En concreto:
1º: si la el Where lleva el campo fecha, no se porque el group by lleva el campo fecha.
2ª Si quieres agrupar el valor de un campo(total) en función del cliente, en el group by debería estar solo el cliente (porque la fecha ya la seleccionas en la seccion del where).
3º Si quieres agrupar por Horas y ordenado por cliente, deberias utilizar el group by horas y order by cliente
En fín, he intentado explicar un poco como funciona el group by, no intento solucionar tu problema, porque no se lo que quieres.
Un saludo
jesús

Rofocale 11-05-2011 17:40:56

no puedo quitarle ningun campo al group by porque da error.. en el group no se pone todos los campos que estan en el select y no son afectados ?.. bueno porque si le quito por ejemplo fecha da error de invalid columm reference

uso como base de datos firebird

identsoft 11-05-2011 17:57:25

No comprendo como en la select tienes ... total-iva, iva, total y sum(total).
¿No será sum(total-iva), Sum(iva) y Sum(total) ?
Si no es así, explica que quieres obtener

Rofocale 12-05-2011 00:23:57

el codigo que tengo arriba quiero que funcione el sum(total) ya que si tengo

nombre total fecha
------ ---- -----
maria 2.5 05/05/2011
jose 2.0 05/05/2011

este me devuelve 2.5 y no 4.5
quiero obtener la suma,el total de lo que se muestra en el campo total

Caral 12-05-2011 02:38:53

Hola
Hay campos coincidentes, en tu caso dos, por lo menos eso es lo que muestras.
Si no se define que o cuales campos sumar como puede hacer la operacion el sistema ?.
Hay que definir que es lo que se quiere y usar los elementos SQL que sean necesarios.
Este es un ejemplo de ese uso, no se si sera tu caso pero es la idea.
Código SQL [-]
   ' SELECT DISTINCT f.caja, Last(f.numero) as numero, f.fecha, '+
   ' f.hora, f.estatus, (f.total - f.iva) AS subtotal,'+
   ' f.iva,f. total, f.cliente, f.clave, sum(f.total) AS gtotal '+
   ' FROM ventas f WHERE f.fecha = :fecha '+
   ' GROUP BY f.caja, f.fecha, f.hora, f.estatus, f.iva, '+
   ' f.total, f.cliente, f.clave '+
   ' ORDER BY Last(f.numero) ';
Como ves se indica la definicion de un campo, en este caso f.caja y ademas se define que sea el ultimo dato de f.numero, osea, busca una linea de la tabla.
Espero que te de alguna idea.
Saludos

identsoft 12-05-2011 10:24:38

Cita:

Empezado por Rofocale (Mensaje 399748)
el codigo que tengo arriba quiero que funcione el sum(total) ya que si tengo

nombre total fecha
------ ---- -----
maria 2.5 05/05/2011
jose 2.0 05/05/2011

este me devuelve 2.5 y no 4.5
quiero obtener la suma,el total de lo que se muestra en el campo total

Si solo quieres obtener la suma del campo 'total' : Select Sum(total) ... where fecha =: FECHA
pero este select es independiente del select anterior.
En el select anterior le estas diciendo (entre otras cosas) que te sume el campo total en función:
1º te le agrupe por caja
2º dentro de caja te lo agrupe por fecha
3º dentro de fecha te lo agrupe por hora
... etc
Al final el sumatorio es el sumatorio de un único registro, lo cual creo que no es lo que buscas.

Rofocale 12-05-2011 19:01:49

exacto.. como podria hacer para resolverlo ? 8-) alguna idea

Rofocale 12-05-2011 21:09:18

como puedo hacer 2 selects a la ves para asi obtener tambien el sum(f.total) de manera correcta ?

Caral 12-05-2011 21:24:38

Hola
Un solo parametro, dos select:
Código SQL [-]
   ' SELECT f.caja, f.numero, f.fecha, '+
   ' f.hora, f.estatus, (f.total - f.iva) AS subtotal,'+
   ' f.iva,f. total, f.cliente, f.clave '+
   ' (SELECT sum(f.total) AS gtotal FROM ventas f WHERE f.fecha = :fecha)'+
   ' FROM ventas f WHERE f.fecha = :fecha '+
   ' GROUP BY f.caja, f.numero, f.fecha, f.hora, f.estatus, f.iva, '+
   ' f.total, f.cliente, f.clave '+
Saludos


La franja horaria es GMT +2. Ahora son las 20:01:45.

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