Você está usando o agregado errado .
count(expression)
conta o número de linhas para as quais a expressão não é nulo. Se você quiser uma soma, use sum(expression)
:db.session.query(func.sum(Item.data['cost'].astext.cast(Numeric))).\
filter(Item.data['surcharge'].astext.cast(Numeric) > 1).\
scalar()
Observe que valores monetários e matemática de ponto flutuante binário são uma mistura ruim devido a floats binários não sendo capazes de representar todos os valores decimais . Em vez disso, use um tipo monetário adequado , ou
Numeric
nesse caso SQLAlchemy usa Decimal
para representar os resultados em Python.