Ciao a tutti. Non riesco a scrivere una query a campi incrociati.

In pratica avendo un campo di tipo date e una serie di messaggi come faccio a stilare un report del genere, dove mi mostri il totale di messaggi per mese/anno.

es.
codice:
anno    gen  feb...           dic
2004     0      3                2
2005     4      2                3
2006     2      0                1
Io ho scritto questa query

codice:
select year(datas) as anno,
case month(datas) when 1 then count(mesg) else 0 end as gen,
case month(datas) when 2 then count(mesg) else 0 end as feb,
case month(datas) when 3 then count(mesg) else 0 end as mar,
case month(datas) when 4 then count(mesg) else 0 end as apr,
case month(datas) when 5 then count(mesg) else 0 end as mag,
case month(datas) when 6 then count(mesg) else 0 end as giu,
case month(datas) when 7 then count(mesg) else 0 end as lug,
case month(datas) when 8 then count(mesg) else 0 end as ago,
case month(datas) when 9 then count(mesg) else 0 end as sett,
case month(datas) when 10 then count(mesg) else 0 end as ott,
case month(datas) when 11 then count(mesg) else 0 end as nov,
case month(datas) when 12 then count(mesg) else 0 end as dic
from messaggi
group by anno
order by anno
Ottengo la mia bella tabella con gli anni e i mesi ma i conteggi son sbagliati, nel senso che mi assegna il totale di ciascun anno a un solo mese. Immagino che il problema sia dovuto al fatto che raggruppo per anno, però, se faccio select extract(year_month from datas ) eccetera, ovviamente mi crea una riga per ogni mese/anno diverso che trova.

Come risolvo? Grazie.