Así, al vuelo, creo que quedaría :
Código SQL
[-]
SELECT CL.nombre AS Cliente, SUM(C.monto) AS Total, SUM(C.monto / P.dinero * P.puntos) AS Puntos
FROM Compra C
INNER JOIN Cliente CL ON CL.id=C.idcliente
LEFT JOIN Promocion P ON P.id=C.idpromo
GROUP BY CL.nombre
ORDER BY CL.nombre
Pongo LEFT JOIN Promocion por si existe alguna venta que no tiene promoción. Así el TOTAL los es de todas las compras, tengan o no promoción.
Si necesitaras que el listado salga separando promociones :
Código SQL
[-]
SELECT CL.nombre AS Cliente, SUM(C.monto) AS Total, SUM(C.monto / P.dinero * P.puntos) AS Puntos, P.nombre AS Promo
FROM Compra C
INNER JOIN Cliente CL ON CL.id=C.idcliente
INNER JOIN Promocion P ON P.id=C.idpromo
GROUP BY CL.nombre, P.nombre
ORDER BY CL.nombre
Por tanto TOTAL lo será de cada promoción, excluyendo las compras hechas sin promoción.
Bueno, sin poder compilarlo es todo lo que puedo hacer
no te aseguro que funcione, pero los tiros van por ahí.
Saludos y suerte.