... das mit der Auslagerung von Teilabfragen in eine UDF ist frei nach Fred Feuerstein Dummfug von der Dummfugigsten Sorte, damit schickt man jede Query Engine in den tiefsten Wald.
Wenn es denn die Summe nicht tut, kann man das auch in subselects auflösen.
In etwa so:
select knd
, (select ist from planz p2 where p1.knd = p2.knd and p2.monat = 201301)
, (select ist from planz p2 where p1.knd = p2.knd and p2.monat = 201302)
, (select ist from planz p2 where p1.knd = p2.knd and p2.monat = 201303)
, (select ist from planz p2 where p1.knd = p2.knd and p2.monat = 201304)
, (select ist from planz p2 where p1.knd = p2.knd and p2.monat = 201305)
...
, (select ist from planz p2 where p1.knd = p2.knd and p2.monat = 201404)
from planz p1

geht sicher noch eleganter, indem man die festen Monate rausnimmt, aber für einen ertsen Test, ob das brummt, reicht das sicherlich aus. (Selbstredend braucht man dann einen Index über Kunde und Monat).
wenn Du dann die leeren noch raus und das ganze in einem string haben willst, packst Du die Stringeritis noch drumherum.

D*B