Yo hice este pequeño código con tablas pivote que te pueda servir, revísalo, si en algo te puede servir
(No lo seguí usando porque había un dato que me jalaba operaciones muy viejas, por un numero de operación o Numero de transacción o algo así y no quise molestar a los de sistemas
Te das cuenta cuando la factura es muy antigua
SELECT
P.[Codigo],
P.[Nombre],
P.[RFC],
P.[Documento],
P.[FechaFact],
P.[FechaPago],
P.[TotalDocto],
P.[Pagado],
Round((Pagado/TotalDocto),4) as Porcentaje,
ROUND(Max-IVATotal,2) as Importe,
round(ROUND(Max-IVATotal,2)*Round((Pagado/TotalDocto),8),2) as ImportePagado,
round(P.[IVATotal]*Round((Pagado/TotalDocto),8),2) as [IVAAcr],
round(P.[Base Retenciones]*Round((Pagado/TotalDocto),8),2)as[BaseRet],
round([1I]*Round((Pagado/TotalDocto),8),2) as [ISRRetHono],
round([1V]*Round((Pagado/TotalDocto),8),2) as [IVARetHono],
round([2I]*Round((Pagado/TotalDocto),8),2) as [ISRRetArre],
round([2V]*Round((Pagado/TotalDocto),8),2) as [IVARetArre],
round([FV]*Round((Pagado/TotalDocto),8),2) as [IVARetFletes],
round([5V]*Round((Pagado/TotalDocto),8),2) as [RetCedular]
FROM(
SELECT
T2.[DocNum]'Documento',
T0.[DocDate]'FechaPago',
T2.[DocDate]'FechaFact',
T2.[CardCode]'Codigo',
T2.[CardName]'Nombre',
T2.[BaseAmnt]'Base Retenciones',
T2.[VatSum] AS 'IVATotal',
T2.[Max1099] as 'Max',
T2.[DocTotal]'TotalDocto',
T1.[SumApplied]'Pagado',
T3.[WTCode]'Ret',
T3.[WTAmnt]'Monto',
T4.[LicTradNum]'RFC'
FROM OVPM T0
INNER JOIN VPM2 T1 ON T0.[DocNum] = T1.[DocNum]
INNER JOIN OPCH T2 ON T1.[DocEntry] = T2.[DocEntry]
left JOIN PCH5 T3 ON T2.[DocEntry] = T3.[AbsEntry]
LEFT JOIN OCRD T4 ON T4.[CardCode] = T2.[CardCode]
WHERE
T0.[DocDate] >= [%0] AND T0.[DocDate] <= [%1]
and t0.Canceled = 'N' ) P
PIVOT (
SUM(Monto)
FOR [Ret] IN ([1V],[1I],[2V],[2I],[5V],[FV])
)P
order by FechaPago, Codigo