Das Jahr aus der Payments Tabelle zu holen, birgt die Gefahr, dass es dort mal gar nicht drin steht. Lückenhafte Daten waren ja angesagt. Und wenn wir schon poetisch werden bei dem Thema:
Lieber ne Taube in der Hand, als ein Spatz auf dem Dach.
Die Spalte mit den Jahren kann über eine separate Tabelle ebenfalls pivotisiert werden. Eine Tabelle mit 5, 10 oder50 Jahreseinträgen bietet einen definierten Rahmen, deren Kreuzprodukt mit einer Monatstabelle a 12 Sätze liefert gezielt alles was gebraucht/gewünscht ist.
Der Ansatz per Stored Proc bietet weiterhin auch die Möglichkeit, auch Daten für wöchentliche oder ander Cluster auszuspucken.
Edit meint: Hab einen Beitrag übersehen, die Lösung von Alex gefällt mir am besten