Pago no me suena correcto. Pago sería una tabla que registra los abonos que hace un cliente. Usted parece que más bien está definiendo DEUDAS, no pagos.
¿Por qué una tabla temporal? Yo tendría una tabla de PAGOS (ahora sí) que asocia un cheque a una deuda y con un monto particular. La relación con cheques sería de 1 a muchos; la relación con deudas sería también de 1 a muchos, convirtiéndose esta tabla en una típica tabla para una relación de muchos a muchos.
La nueva tabla PAGO sería: ID PK, IDCheque, IDDeuda, Monto.
Luego la consulta: Sumamente complicada para mi cerebro. A ver si entre todos podemos: Pienso que en un CTE o tabla temporal se ordenan las deudas por antigüedad y por monto (se les puede asignar un Row_Number()), luego otro CTE o tabla temporal que ordene los cheques de alguna forma conveniente. Lo de mayor número de pagos posibles que alcance no es posible porque para eso se ocuparían las combinaciones, pero bueno, digamos que los ordenamos por monto descendiente y luego calculamos el running total (no sé cómo se llama en español). Y hasta ahí he llegado.
He pensado en mover el CTE de los cheques a una función de tabla y hacer un CROSS APPLY con los registros de deudas, pero no sé cómo exactamente, especialmente cómo saber si a algún cheque usado en una deuda anterior le queda saldo.
Jose R. MCP
Code Samples