Этот код дает ожидаемый результат.Протестировано в SQL Fiddle .Предполагается, что данные хранятся в таблице table1
:
with first_letters as
(
select
upper(left(Name,1)) as letter_uppercase,
count(*) as count_ignore
from table1
group by upper(left(Name,1))
),
occurrences as (
select
t1.Name,
length(t1.Name) - length(replace(upper(t1.Name), fl.letter_uppercase,'')) as occurrence
from table1 t1
inner join first_letters fl on fl.letter_uppercase = upper(left(t1.Name,1))
)
select
result.letter_uppercase,
sum(result.occurrence) as sum_occurrence
from
(
select
fl.letter_uppercase,
o.occurrence
from first_letters fl
inner join occurrences o on upper(o.Name) like '%' || fl.letter_uppercase || '%'
) result
group by result.letter_uppercase
order by sum(result.occurrence) desc,
result.letter_uppercase;