Je suggérerais de calculer un pourcentage courant à l'aide d'une fonction de fenêtre, puis de comparer le résultat à 80.
Dans ce petit exemple de code, j'ai montré comment le faire en fonction du résultat de votre requête placé dans un bloc CTE appelé your_data
. Cela vous montre juste l'idée.
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
En fait, il renvoie 3 lignes et vous dites que vous vous attendez à ce que 4 lignes soient affichées. Afin d'ajouter la ligne où le pourcentage courant dépasse en premier votre limite (80), vous pouvez extraire le pourcentage de la catégorie actuelle de la valeur courante, c'est-à-dire remplacer sum(percentage) over (order by category)
avec sum(percentage) over (order by category) - percentage
.
HTH