Retroceder   Foros del Web > Programación para sitios web > Bases de Datos

Respuesta
 
Herramientas Desplegado
Antiguo 18-dic-2007, 07:44   #1 (permalink)
RataASP ha deshabilitado el karma
 
Fecha de Ingreso: diciembre-2007
Mensajes: 4
Problema con SUM y HAVING

Hola:

Estoy trabajando en una página que informa los saldos de cuenta corriente de un grupo de personas (campos a mostrar: persona, debe, haber y saldo), en la cual se filtran unicamente o los registros históricos o los de un determinado rango de fechas, cuyo saldo es negativo (mostrar solo el debe, haber y saldo de las personas cuyo saldo sea negativo).

Además de esta información quiero colocar al final de la página, el saldo total de ese grupo de cuentas corrientes con saldo negativo (totales del debe, haber y saldo).

Para hacerlo, genero 2 recordsets: uno que devuelva el debe, haber y saldo de cada una de las cuentas corrientes y otro que totalice el debe, haber y saldo de los registros del primer recordset.

Este es el cógigo SQL que genero para ambos recordsets:

Variables:
varMesPeriodo: puede ser "%" (para todos) o "ENE", "FEB", etc. etc.
varAnoPeriodo: puede ser "%" (para todos) o "2005", "2006", etc. etc.

Recordset 1: rsCtaCte

SELECT
ctacte.anoperiodo,
ctacte.mesperiodo,
socios.idsocio,
socios.apellido,
socios.nombre,
SUM(CASE WHEN IsNull(ctacte.debe) THEN 0 ELSE ctacte.debe END) AS totaldebe,
SUM(CASE WHEN IsNull(ctacte.haber) THEN 0 ELSE ctacte.haber END) AS totalhaber,
(SUM(CASE WHEN IsNull(ctacte.haber) THEN 0 ELSE ctacte.haber END) - SUM(CASE WHEN IsNull(ctacte.debe) THEN 0 ELSE ctacte.debe END)) AS saldo

FROM
ctacte RIGHT OUTER JOIN socios ON (ctacte.idsocio = socios.idsocio)

WHERE
ctacte.mesperiodo LIKE varMesPeriodo AND ctacte.anoperiodo LIKE varAnoPeriodo

GROUP BY
socios.idsocio

HAVING
saldo < 0

ORDER BY
apellido, nombre


Recordset 2: rsCtaCteTotales

SELECT
SUM(CASE WHEN IsNull(ctacte.debe) THEN 0 ELSE ctacte.debe END) AS totaldebe,
SUM(CASE WHEN IsNull(ctacte.haber) THEN 0 ELSE ctacte.haber END) AS totalhaber,
(SUM(CASE WHEN IsNull(ctacte.haber) THEN 0 ELSE ctacte.haber END) - SUM(CASE WHEN IsNull(ctacte.debe) THEN 0 ELSE ctacte.debe END)) AS saldo

FROM
ctacte RIGHT OUTER JOIN socios ON (ctacte.idsocio = socios.idsocio)

WHERE
ctacte.mesperiodo LIKE varMesPeriodo AND ctacte.anoperiodo LIKE varAnoPeriodo

HAVING
saldo < 0


El Recordset1 (que lista uno a uno los saldos de las ctas ctes) funciona sin problemas, ya sean saldos historicos y dentro de algun periodo. El Recordset2 también funciona bien cuando defino algun periodo como rango, por ejemplo varMesPeriodo = "NOV" y varAnoPeriodo = "2007". El problema lo tengo en el Recordset2 cuando varMesPeriodo = "%" (todos) y varAnoPeriodo = "%" (todos), ya que no me devuelve ningún registro.

¿Estoy haciendo algo mal?....
¿Cómo puedo lograr que esto funcione?...

Saludos,
RataASP
RataASP está desconectado   Responder Citando
Antiguo 19-dic-2007, 18:51   #2 (permalink)
ingcaresc ha deshabilitado el karma
 
Fecha de Ingreso: diciembre-2007
Mensajes: 6
Re: Problema con SUM y HAVING

Hola RataASP, probe los scripts que pones, no se que estes usando pero yo los probe en SQLServer, y funcionan bien, excepto por la funcion "isnull" que aqui se maneja asi:
isnull(campo,valordereemplazo), tambien modifique "Having" y lo traslade al "where"
porque no puedes hacer referencia al campo "saldo", siendo que apenas lo estas formando en la consulta, amenos que hicieras una subconsulta o una vista y asi si funcionaria.

SELECT
ctacte.anoperiodo,
ctacte.mesperiodo,
socios.idsocio,
socios.apellido,
socios.nombre,
SUM(CASE WHEN IsNull(ctacte.debe,0)=0 THEN 0 ELSE ctacte.debe END) AS totaldebe,
SUM(CASE WHEN IsNull(ctacte.haber,0)=0 THEN 0 ELSE ctacte.haber END) AS totalhaber,
(SUM(CASE WHEN IsNull(ctacte.haber,0)=0 THEN 0 ELSE ctacte.haber END) - SUM(CASE WHEN IsNull(ctacte.debe,0)=0 THEN 0 ELSE ctacte.debe END)) AS saldo

FROM
ctacte RIGHT OUTER JOIN socios ON (ctacte.idsocio = socios.idsocio)

WHERE
ctacte.mesperiodo LIKE @varMesPeriodo AND ctacte.anoperiodo LIKE @varanoperiodo
and ctacte.haber-ctacte.debe < 0

GROUP BY
socios.idsocio,
socios.apellido,
socios.nombre,
ctacte.anoperiodo,
ctacte.mesperiodo

--HAVING
--saldo < 0

ORDER BY
apellido, nombre


recorsed2

SELECT
SUM(CASE WHEN IsNull(ctacte.debe,0)=0 THEN 0 ELSE ctacte.debe END) AS totaldebe,
SUM(CASE WHEN IsNull(ctacte.haber,0)=0 THEN 0 ELSE ctacte.haber END) AS totalhaber,
(SUM(CASE WHEN IsNull(ctacte.haber,0)=0 THEN 0 ELSE ctacte.haber END) - SUM(CASE WHEN IsNull(ctacte.debe,0)=0 THEN 0 ELSE ctacte.debe END)) AS saldo

FROM
ctacte RIGHT OUTER JOIN socios ON (ctacte.idsocio = socios.idsocio)

WHERE
ctacte.mesperiodo LIKE @varMesPeriodo AND ctacte.anoperiodo LIKE @varAnoPeriodo
and ctacte.haber-ctacte.debe < 0
--HAVING
--saldo < 0
ingcaresc está desconectado   Responder Citando
Respuesta
No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 20:24.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93