Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   ayuda con sum() sql (https://www.clubdelphi.com/foros/showthread.php?t=83245)

joselaz 26-05-2013 19:41:09

ayuda con sum() sql
 
Hola a todos... Necesito vuestra ayuda...

Intento conseguir sumar (totalizar) una columna llamada importe después de aplicar un select para filtra por nombre de proveedor, es decir, algo algo así como:

Código SQL [-]
datos.anotabl.SQL.Add('select * from anotaciones where prcodan between '+ancodp2.Caption+' and '+ancodp5.Caption);

este código funciona bien... es decir me devuelve una consulta con los proveedores que están dentro de un rango...

es decir necesito tener un grid que me muestre la sql de más arriba(lo cual si funciona bien) y además me muestre el total de sumar los impotes...

Espero haberme explicado bien...

Gracias de antemano, saludos...

joselaz 26-05-2013 21:42:54

algo más que me faltó !!!
 
Hola de nuevo, debo añadir, que a su vez, cuando modifique o añada nuevos importes y que sean coincidentes con ese criterio, pues se modifique automaticamente ese total...

gracias de nuevo

ecfisa 26-05-2013 22:04:47

Hola joselaz y bienvenido a Club Delphi :)

Como a todos los que se inician te invitamos a que leas nuestra guía de estilo.

Por favor aporta la mayor cantidad de detalles inherentes a tu pregunta, por ejemplo el RDBMS(bd) con que estas trabajando, ya que hay diferencia de sintáxis entre ellos.

Lo mismo en cuanto al resultado que buscas lograr, por ejemplo:
  • ¿ El resultado deberá ser un dato único, o se presentará como otra columna del DBGrid ?
  • ¿ Es la suma de todos los importes comprendidos en el rango o debe ser discriminada por proveedor ?
  • ¿ Deseas una sumatoria acumulativa ?

Saludos. :)

joselaz 26-05-2013 22:56:13

aporto mas datos
 
Hola, ante todo, gracias por responder...

Voy a intentar aportar más datos:

-La base de datos está hecha en firebird 2.5
-El datos deberá mostrarse en una etiqueta de texto o similar, no en el dbgrid...Sería como un datos único, que variará al modificar o añadir algún datos nuevo...Iría en una simple etiqueta de texto con formato.
-necesitaría la suma de los importes del rango seleccionado de proveedores, por ej.

nº proveedor importe ..........

23 25,00
23 50,00
23 60,00
24 22,00
24 10,00
25 15,00
26 23,00

ej. rango desde proveedor 24 al 25, el total debería ser 47,00. Si luego añado o modifico algún importe de algún proveedor de ese rango, por ej. el nº 24, pues debe cambiar la suma automaticamente. Así que si modifico por ej. del proveedor nº 24 el importe 10,00 por 12,00 la suma total del rango debe cambiar automaticamente a 49,00.

Espero haber aportado la información adicional necesaria para ayudar a entender mejor lo que necesito hacer.

Muchas gracias...

oscarac 26-05-2013 23:50:30

los importes estan en la misma tabla?
estan en una tabla diferente?
seria bueno que colocaras la estructura de tus tablas, para tener una mejor idea

joselaz 27-05-2013 00:24:58

misma tabla
 
si, los datos están en la misma tabla....

realmente solo necesito hacer una suma de una columna... una especie de total que aparecerá en una etiqueta, pero de forma que si hago una selección por un rango, pues la suma se limite solo a ese rango, o si modifico algún importe de ese rango pues se modifique la suma automáticamente...

No pongo una imagen de la estructura, porque no sé como insertar la imagen aquí, pero a rasgos generales es lo anterior lo que necesito hacer....

En el pasado pude hacerlo y se que se puede, además debe ser algo básico de sql que no controlo lo suficiente, pero el código fuente lo he perdido y no consigo hacerlo...

saludos...

oscarac 27-05-2013 00:31:33

podrias usar la funcion group by

algo asi

Código SQL [-]
select prcodan, nombreproveedor, Sum (Importe)
From Tabla
where (tus condiciones)
Group by prcodan, nombreproveedor

joselaz 27-05-2013 01:15:55

conseguido
 
Gracias oscar, lo he logrado hacer siguiendo tus indicaciones, aunque he tenido que usar otra consulta paralela y agrupando por prcodan, de tal manera que el campo resultante del sum(animport) as totalimp es el que asocio al dbedit y al modificar o añadir un dato, hago un refresh a la segunda query y la suma se modifica, que es lo que necesito...

Muchas gracias por vuestra ayuda...

oscarac 27-05-2013 01:20:19

Cita:

Empezado por joselaz (Mensaje 461282)
Gracias oscar, lo he logrado hacer siguiendo tus indicaciones, aunque he tenido que usar otra consulta paralela y agrupando por prcodan, de tal manera que el campo resultante del sum(animport) as totalimp es el que asocio al dbedit y al modificar o añadir un dato, hago un refresh a la segunda query y la suma se modifica, que es lo que necesito...

Muchas gracias por vuestra ayuda...

podrias colocar aqui cual fue esa consulta?
si todo esta en una solo tabla no hay mucha ciencia
quiza podamos optimizarla

ecfisa 27-05-2013 01:31:46

Cita:

Empezado por joselaz (Mensaje 461275)
-El datos deberá mostrarse en una etiqueta de texto o similar, no en el dbgrid
...

Hola joselaz.

Entonces otra opción es hacerte una función para obtener la sumatoria:
Código Delphi [-]
...
function TForm1.GetTotal(const Desde, Hasta: string): Currency;
begin
  with tuOtroADOQuery do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT SUM(IMPORTES) AS SUMA FROM ANOTACIONES');
    SQL.Add('WHERE PRCODAN >= :DESDE AND PRCODAN <= :HASTA');
    Parameters.ParamByName('DESDE').Value := Desde;
    Parameters.ParamByName('HASTA').Value := Hasta;
    Open;
    Result := FieldByName('SUMA').AsCurrency;
    Close;
  end;
end;

Llamada ejemplo:
Código Delphi [-]
  Label1.Caption := FormatFloat('$ 0.00', GetTotal(ancodp2.Caption, ancodp5.Caption));

Saludos. :)

joselaz 27-05-2013 23:00:36

otra buena opción ecfisa
 
Gracias por vuestras respuestas. Sin duda, el código que me pasas es una buena alternativa para optimizar la consulta que tengo echa.Usando los parámetros.
Yo lo tengo echo de una forma más fea y engorrosa:

Código SQL [-]
datos.anotabl.SQL.Add('select * from anotaciones where prcodan between '+ancodp2.Caption+' and '+ancodp5.Caption+' and anfecha between '+chr(39)+FormatDateTime('mm/dd/yyyy', anofechini.date)+chr(39)+' and '+chr(39)+FormatDateTime('mm/dd/yyyy', anofechfini.date)+chr(39));

Lo pongo para que vean , pero realmente me hubiera resultado mejor y más manejable, usar parámetros...

Muchas gracias. saludos... :)


La franja horaria es GMT +2. Ahora son las 10:07:15.

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