Suggerirei di calcolare una percentuale corrente utilizzando una funzione finestra e quindi confrontare il risultato con 80.
In questo piccolo esempio di codice ho mostrato come farlo in base al risultato della tua query inserita in un blocco CTE chiamato your_data
. Ti mostra solo l'idea.
with
your_data (category, percentage) as(
-- sample data based on your example
select 1, 32 from dual union
select 2, 20 from dual union
select 3, 20 from dual union
select 4, 10 from dual union
select 5, 18 from dual
),
t as (
select your_data.*,
-- running sum calculation
sum(percentage) over (order by category) pctg_running
from your_data
)
select *
from t
where pctg_running <= 80
In realtà restituisce 3 righe e dici che ti aspetti che vengano mostrate 4 righe. Per aggiungere la riga in cui la percentuale corrente supera per prima il tuo limite (80), puoi estrarre la percentuale della categoria corrente dal valore corrente, ovvero sostituire sum(percentage) over (order by category)
con sum(percentage) over (order by category) - percentage
.
HTH