Ich würde vorschlagen, einen laufenden Prozentsatz mit einer Fensterfunktion zu berechnen und dann das Ergebnis mit 80 zu vergleichen.
In diesem kleinen Codebeispiel habe ich gezeigt, wie es geht, basierend auf dem Ergebnis Ihrer Abfrage, die in einen CTE-Block namens your_data
platziert wurde . Es zeigt Ihnen nur die Idee.
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
Tatsächlich gibt es 3 Zeilen zurück und Sie sagen, Sie erwarten, dass 4 Zeilen angezeigt werden. Um die Zeile hinzuzufügen, in der der laufende Prozentsatz zuerst Ihre Grenze (80) überschreitet, können Sie den aktuellen Kategorieprozentsatz aus dem laufenden Wert extrahieren, d. h. sum(percentage) over (order by category)
ersetzen mit sum(percentage) over (order by category) - percentage
.
HTH