Hola.
Prueba con esto (es lo que te ha sugerido Alberto, incluyendo un par de buenas prácticas, como no aplicar funciones a los campos sino a las constantes e indicar longitud al realizar la conversión a un tipo de cadena):
select convert (char(10),fecha,103),count(*) as tot
from Tabla
where fecha >= '20100301' and fecha < '20100401'
group by convert (char(10),fecha,103)
Te sale únicamente un registro por día porque agrupas por la fecha (con horas y minutos), muestras la fecha (sin hora) y tienes un distinct puesto que evita que salga un registro por cada uno. En otras palabras, la agrupación no está haciendo lo que pretendes y el distinct lo enmascara. Por eso te sale un registro de cada día y uno en el recuento.
Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)