As previously mentioned, PIVOT is one (and probably the preferable) way. If your particular DBMS doesn't support PIVOT, about the only other way I can think of is by using selfjoins or a UNION. For example:
SELECT a.custID AS Customer, COALESCE(b.totPay, 0) AS "January Payments",
COALESCE(c.totPay, 0) AS "February Payments", ... FROM
(SELECT custID FROM customer) a
LEFT OUTER JOIN
(SELECT custID, SUM(paymentAmount) AS totPay FROM payments
WHERE MONTH(paymentDate) = 1 GROUP BY custID) b
ON a.custID = b.custID
LEFT OUTER JOIN
...
LEFT OUTER JOIN
(SELECT custID, SUM(paymentAmount) AS totPay FROM payments
WHERE MONTH(paymentDate) = 12 GROUP BY custID) m
ON a.custID = m.custID
SELECT custID AS Customer, SUM(janPay) AS "January Payments",
SUM(febPay) AS "February Payments", ... FROM
(SELECT custID, SUM(paymentAmount) AS janPay), 0 AS febPay, 0 AS marPay, ...
FROM payments WHERE MONTH(paymentDate) = 1 GROUP BY custID)
UNION
(SELECT custID, 0, SUM(paymentAmount), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
FROM payments WHERE MONTH(paymentDate) = 2 GROUP BY custID)
UNION
...
UNION
(SELECT custID, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, SUM(paymentAmount),
FROM payments WHERE MONTH(paymentDate) = 12 GROUP BY custID)
GROUP BY custID