Mirate los aggregate de un clientdataset, permiten sum, avg, count, max y min . . .
Código:
function aggregateCDS(cds:TClientDataSet; const expression:string; const valorPorDefecto:currency):currency;
var
agg:TAggregate;
begin
agg:=TAggregate.Create(cds.Aggregates,cds);
agg.Expression:=expression;
agg.Active:=True;
if not VarIsNull(agg.Value)
then Result:=agg.Value
else Result:=valorPorDefecte;
agg.Free;
end;
Saludos!