PDA

Ver la Versión Completa : problemas con SUM


Giniromero
16-10-2003, 20:22:40
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:SELECT NUMCLI, SUM(IMPHABER-IMPDEBE) AS IMPORTE
FROM ECONO
GROUP BY NUMCLIóSELECT SUM(IMPHABER-IMPDEBE) AS IMPORTE
FROM ECONOSi quieres que muestre la suma, y los el detalle sin agrupar, algunos motores te permiten hacer esto:SELECT NUMCLI, (IMPHABER-IMPDEBE) PARCIAL,
(SELECT SUM(IMPHABER, IMPDEBE)
FROM ECONO) TOTAL
FROM ECONOEsto ú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:SELECT NUMCLI, (IMPHABER-IMPDEBE) PARCIAL,
(SELECT SUM(IMPHABER, IMPDEBE)
FROM ECONO E2
WHERE E1.NUMCLI=ED.NUMCLI) TOTAL
FROM ECONO E1De 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:


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:


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,


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:



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,

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