Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   problemas con SUM (https://www.clubdelphi.com/foros/showthread.php?t=4475)

Giniromero 16-10-2003 20:22:40

problemas con SUM
 
Hola,

Estoy usando interbase7 con dialecto 3.

Pretendo restar dos campos, de una misma tabla, cuyo tipo es numeric(15,2), y el resultado asignarselo al campo importe.

Hasta aquí todo bien.

El código que tengo para esto es:



select NUMCLI, IMPHABER, IMPDEBE, (imphaber - impdebe) AS IMPORTE
from econo

WHERE NUMCLI =:cliente.numcli
ORDER BY NUMCLI


Esto funciona OK, me pide que le diga el valor de cliente.numcli, se lo doy y me saca una lista con los campo que le pido, y un campo mas, IMPORTE, en el que figura la resta pedida.

El problema es cuando intento hacer un SUM con el campo importe obtenido.

Esto es, necesito sumar todos los valores resultantes de la resta anterior, y obtener un único resultado.

Para hacerlo, he utilizado el siguiente código:


select NUMCLI, IMPHABER, IMPDEBE, sum (imphaber - impdebe) AS IMPORTE
from econo

WHERE NUMCLI =:cliente.numcli
ORDER BY NUMCLI


pero esto me devuelve el siguiente error:


Invalid token.
Dynamic SQL Error.
SQL error code = -104.
invalid column reference.


¿Alguien puede decirme que estoy haciendo mal?
¿que se me escapa? ¿que no estoy teniendo en cuenta y debería?

Muchas gracias por la ayuda de antemano,

Virginia

delphi.com.ar 16-10-2003 21:12:37

No puedes consultar campos y campos afectados a funciones de grupo en la misma consulta, a no ser que pertenezcan al grupo o que utilices subconsultas.
Aclarando: Sum es una funcion de grupo, devuelve la suma de un grupo de resultados, puedes utilizarla con un group by o sin este, por ejemplo:
Código:

SELECT NUMCLI,  SUM(IMPHABER-IMPDEBE) AS IMPORTE
FROM ECONO
GROUP BY NUMCLI

ó
Código:

SELECT SUM(IMPHABER-IMPDEBE) AS IMPORTE
FROM ECONO

Si quieres que muestre la suma, y los el detalle sin agrupar, algunos motores te permiten hacer esto:
Código:

SELECT NUMCLI, (IMPHABER-IMPDEBE) PARCIAL,
      (SELECT SUM(IMPHABER, IMPDEBE)
          FROM ECONO) TOTAL
FROM ECONO

Esto último, no tiene mucha lógica pues vas a mostrarle el total por cada fila, sería mas lógico si es un grupo que quieres mostrar el detalle:
Código:

SELECT NUMCLI, (IMPHABER-IMPDEBE) PARCIAL,
      (SELECT SUM(IMPHABER, IMPDEBE)
          FROM ECONO E2
        WHERE E1.NUMCLI=ED.NUMCLI) TOTAL
FROM ECONO E1

De todos modos, te recomiendo analizar bien que datos quieres mostrar, pues estos últimos suelen servir únicamente para marear al usuario.

Saludos!

Giniromero 17-10-2003 18:22:54

Hola,

He estado trabajando en base a lo que me diste.

Efectivamente, si pongo GROUP BY, me devuelve un sólo registro, con el valor de la suma total de todos los registros que para un mismo cliente hay.

El código que me ha funcionado es:

Cita:

select NUMALU,SUM(0 - econo.impdebe + econo.imphaber) IMPORTE
from econo
WHERE NUMALU =:alumnos.numalu
GROUP BY NUMALU
ORDER BY NUMALU

Pero, si trato de usar el código que me aconsejaste:

Cita:

SELECT NUMCLI, (0 - IMPDEBE + IMPHABER) PARCIAL,
(SELECT SUM(IMPDEBE, IMPHABER)
FROM ECONO E2
WHERE E1.NUMCLI=clientes.NUMCLI) TOTAL
FROM ECONO E1
Me da el siguiente error:


Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 25.
,.

Y el cursor se me queda parado en la segunda línea, en IMPDEBE.

¿Que es lo que estoy poneindo mal ?

Saludos, y gracias por la ayuda.

Virginia

delphi.com.ar 17-10-2003 18:40:33

No lo estas poniendo igual que lo que te he pasado, fíjate que en el SQL que tu pasas aparece un alias "clientes" que no pertenece a ninguna tabla.

Saludos!

Giniromero 20-10-2003 10:04:26

Hola,

Cita:

No lo estas poniendo igual que lo que te he pasado, fíjate que en el SQL que tu pasas aparece un alias "clientes" que no pertenece a ninguna tabla.


quote:
--------------------------------------------------------------------------------

SELECT NUMCLI, (0 - IMPDEBE + IMPHABER) PARCIAL,
(SELECT SUM(IMPDEBE, IMPHABER)
FROM ECONO E2
WHERE E1.NUMCLI=clientes.NUMCLI) TOTAL
FROM ECONO E1

--------------------------------------------------------------------------------


tal vez no aclaré que clientes, es el nombre de una tabla, supuse que era equivalente a poner el ED, tal como aparece en tu código. No se si tiene que ver con que no aparece relacionado con ninguna tabla, como pasa con E1 y E2, usando el from.

Esto es:

Cita:


SELECT NUMALU, (0 - IMPDEBE + IMPHABER) PARCIAL,
(SELECT SUM(IMPDEBE, IMPHABER)
FROM ECONO E2
WHERE E1.NUMALU=ED.NUMALU) TOTAL
FROM ECONO E1


Disculpa mi torpeza, pero, no veo donde está el problema.

Muchas gracias por la ayuda, en cualquier caso.

Virginia

delphi.com.ar 20-10-2003 16:43:59

Si es así lo tienes que hacer al revés, lo que haces cuando nombras una tabla en el FROM y a su lado pones un nombre X... es definir que X es el alias para la tabla que lo precede, y puedes utilizar X. para aclara que un campo Z pertenece a esa tabla/vista/resultado (Z.X).

Virginia, con toda sinceridad te recomiendo que leas algo de SQL, porque veo que te estás tropezando con conceptos muy básicos, y te aseguro que un Libro o Curso acelerará tu trabajo notablemente.

Saludos!

Giniromero 21-10-2003 10:46:21

Te agradezco la ayuda,

Cita:

te recomiendo que leas algo de SQL, porque veo que te estás tropezando con conceptos muy básicos, y te aseguro que un Libro o Curso acelerará tu trabajo notablemente.
Tienes razón, estoy tropezando con conceptos básicos, pero aunque tengo libros al respecto, no me dejan claros los conceptos, creo que no empiezan desde cero, si me pudieras aconsejar alguno que pudiera servirme... te quedaría muy agradecida.

Saludos

Virginia


La franja horaria es GMT +2. Ahora son las 15:40:17.

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