FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
No sabria decirte si estas haciendo algo mal, me da que el '%' no esta funcionando; Prueba tambien de no llamar por el alias en el HAVING, pon la expresion completa.
si no, una alternativa es que , a tu recordset le asignes el codigo sql en runTime, le pasas o no la clausula where, ... , como es esto? Ejemplo: Código:
My_Query.sql.Add:= 'SELECT .....' ; My_Query.sql.Add:= ' FROM .....' ; if(agrego_Condicion_al_SQL) then My_Query.sql.Add:= ' WHERE ....'; if(agrego_Orden_al_SQL) then My_Query.sql.Add:= ' GROUP BY ...' ; if(agrego_Cond_Extra_al_SQL) then My_Query.sql.Add:= ' HAVING ....'; My_Query.sql.Add:= ';' ; |
#3
|
|||
|
|||
Problema resuelto...
Estimado Juan:
Ante todo gracias por el aporte. Estuve investigando un poco y la respuesta para mi problema son la Subconsultas... En mi caso, tengo que meter el Recordset1 como tabla del Recorsdset2. Este sería el código de mi Recordset2 (en azul la consulta y en rojo la subconsulta): SELECT SUM(totaldebe) AS grantotaldebe, SUM(totalhaber) AS grantotalhaber, (SUM(totalhaber)-SUM(totaldebe)) AS grantotalsaldo FROM (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 MMColParam4 AND ctacte.anoperiodo LIKE MMColParam5 GROUP BY socios.idsocio HAVING saldo < 0 ORDER BY apellido, nombre) AS subtotales Saludos! RataASP |
|
|
|