Você pode filtrar os valores não numéricos com uma função como esta resposta fornece , ou com uma expressão regular - que pode precisar de alguns ajustes:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and regexp_like(result_num, '^[-]?[0-9]*[\.]?[0-9]*$')
and cast(result_num as integer) > 104
group by result_num;
SQL Fiddle .
Isso excluirá a maioria dos não-números (talvez todos, mas não estou tão confiante - regex não é uma área forte), embora a função de Justin seja provavelmente mais segura.
No entanto, ainda não há garantia de que a função de filtro será aplicada antes da conversão. Se isso ainda ocorrer, você poderá usar uma subconsulta para filtrar valores não numéricos e verificar o valor real daqueles que permanecem; mas você provavelmente precisaria adicionar uma dica para impedir que o Oracle desaninhasse a subconsulta e alterasse a ordem de avaliação em você.
Outra abordagem é uma variação da função de Justin que retorna o número real:
CREATE OR REPLACE FUNCTION safe_number( p_str IN VARCHAR2 )
RETURN NUMBER DETERMINISTIC PARALLEL_ENABLE
IS
l_num NUMBER;
BEGIN
l_num := to_number( p_str );
RETURN l_num;
EXCEPTION
WHEN value_error THEN
RETURN null;
END safe_number;
/
Então sua consulta pode usar isso:
select count(1), result_num
from vitals
where test_cd = 'TEMP'
and safe_number(result_num) > 104
group by result_num;
SQL Fiddle .