Come ti accennavo ti serve una tabella con un solo campo (nel mio esempio tabella di nomer serie con un campo di nome i) che conterrà una sequenza di numeri progressivi abbastanza grande da coprire tutto il range dei tuoi record.
Giocando con le variabili creerai una sequenza particolare. Se ad esempio il primo gruppo contiene solo 7 record, la variabile assumerà valori da 1 a 7, per il secondo gruppo il conteggio partirà da 11 e così via.
In questo modo tramite un left join puoi creare le righe mancanti limitando la ricerca al numero di tipi distinti moltiplicato per 10.
codice:
select s.*,t3.*
from serie as s
left join (
select id,tipo,totale,pos,((cum*10)+pos)-10 as deca,cum
from (
select
id, tipo,totale,
if( @prec!=tipo,@riga:=1,@riga:=@riga+1) as pos,
if( @prec=tipo,@x,@x:=@x+1) as cum,
@prec := tipo
from tab t1
inner join (select @riga:=null, @prec:=0, @x:=0) as r
order by t1.tipo,t1.totale desc
) as t2
where pos <= 10 and totale > 30
) as t3
on s.i = t3.deca
where s.i <= (select count(distinct(tipo))*10 from tab )
order by s.i
Come vedi è fattibilissimo ma a mio modesto avviso del tutto inutile e macchinoso.