Talvez esta vista te pueda ayudar:
Código SQL:
Ver originalCREATE TABLE fdw_example4_alumno_altasbajas (
DNI VARCHAR(20) NOT NULL,
FechaEst DATE NOT NULL,
TipoEstado VARCHAR(10) NOT NULL,
PRIMARY KEY (DNI, FechaEst)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE fdw_example4_alumno_pago(
DNI VARCHAR(20) NOT NULL,
MesPagado VARCHAR(20) NOT NULL,
Importe DECIMAL(16,2) NOT NULL,
FechaPago DATE NOT NULL,
Comentario VARCHAR(100) NOT NULL,
PRIMARY KEY (DNI, MesPagado)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE VIEW v_fdw_example4_alumno_altasbajas_aux AS
SELECT a.DNI, a.FechaEst, a.TipoEstado, MIN(b.FechaEst) AS Siguiente
FROM fdw_example4_alumno_altasbajas a LEFT OUTER JOIN fdw_example4_alumno_altasbajas b ON b.DNI = a.DNI AND b.FechaEst > a.FechaEst
WHERE a.TipoEstado = 'ALTA'
GROUP BY a.DNI, a.FechaEst;
CREATE VIEW v_fdw_example4_alumno_altasbajas AS
SELECT x.DNI, x.FechaEst, x.TipoEstado,
CASE isnull(x.Siguiente) WHEN 1 THEN date_format(now(), '%Y-%m-%d') ELSE x.Siguiente END AS FechaSiguiente,
CASE isnull(x.Siguiente) WHEN 1 THEN 'SIGUE DE ALTA' ELSE y.TipoEstado END AS EstadoSiguiente
FROM v_fdw_example4_alumno_altasbajas_aux x
LEFT OUTER JOIN fdw_example4_alumno_altasbajas y ON y.DNI = x.DNI AND y.FechaEst = x.Siguiente;
INSERT INTO fdw_example4_alumno_altasbajas (DNI, FechaEst, TipoEstado) VALUES
('12345678Y', '2011-05-02', 'ALTA'),
('87654321B', '2011-06-01', 'ALTA'),
('12345678Y', '2011-08-01', 'BAJA'),
('87654321B', '2011-07-01', 'BAJA'),
('12345678Y', '2012-05-07', 'ALTA');
INSERT INTO fdw_example4_alumno_pago (DNI, MesPagado, Importe, FechaPago, Comentario) VALUES
('12345678Y', 'MAYO11', 999, '2011-05-03', 'PAGO MES MAYO'),
('12345678Y', 'JUNIO11', 999, '2011-06-05', 'PAGO MES JUNIO'),
('87654321B', 'JUNIO11', 999, '2011-06-02', 'PAGO MES JUNIO'),
('12345678Y', 'MAYO12', 999, '2012-05-10', 'PAGO MES MAYO');
commit;
SELECT * FROM v_fdw_example4_alumno_altasbajas;
Lo que hace es mostrarte en una "tabla" las altas con su correspondiente baja. Si "sigue de alta", en la columna FechaSiguiente aparecerá la fecha actual y en EstadoSiguiente aparecerá "SIGUE DE ALTA".
Entonces, tu listado de "pendientes de pago" tendrá como filtrarse por los períodos en los que el alumno ha estado de alta con un join a esta vista.
Lo que no veo claro es como sabes que meses son los que deberían ser pagados. Es decir, si la alta es el 30 de Julio, ¿se cobra Julio?; si la baja es el 1/Agosto, ¿Agosto también se paga? ¿y si fuese el 5? ¿Todos los meses existentes entre una fecha de alta y una de baja son cobrables? ¿No tienen vacaciones o todos los alumnos los ponen de baja ese período de tiempo?
Te sugiero que tu tabla de pagos la conviertas en una simple cuenta corriente con registros a favor y en contra del alumno. Una vez cada mes generas todos los cargos que correspondan a los alumnos que están de alta. En caso de que exista un cargo que no es correcto (por ejemplo, que la baja la hace el 5 de Agosto y se genero cargo el día 1 y la entidad para la que trabajas no quiere cobrarle Agosto a ese alumno), el sistema puede dar la opción a aplicar un "abono" a favor del alumno.
Para automatizar el proceso de generación de cargos, lo puedes poner en una tarea en el servidor que se ejecute una vez al mes y listo. O bien, condenas a la secretaria a hacer click en un botón cada mes. ;)