Похоже, у вас есть сводные данные. Если в исходной таблице данные не развернуты, работайте над этой таблицей. Вот решение с вашей текущей структурой:
with
weights(id, food_group, weight) as (
select 1, 'CEREALS AND TUBERS', 2 from dual union all
select 2, 'PULSES', 3 from dual union all
select 3, 'VEGETABLES', 1 from dual union all
select 4, 'FRUIT', 1 from dual union all
select 5, 'MEAT AND FISH', 4 from dual union all
select 6, 'MILK', 4 from dual union all
select 7, 'SUGAR', .5 from dual union all
select 8, 'OIL', .5 from dual )
select food_group, past_7_days, weight, result,
case when id is null and result <= 28 then 'Low'
when id is null and result between 28.5 and 42 then 'Normal'
when id is null and result >= 42.5 then 'High'
end as interpretation
from (
select food_group, past_7_days, weight, sum(past_7_days * weight) result, id
from (
select *
from tbl_fcs
unpivot (past_7_days for food_group in (
fcs_cereals_and_tubers as 'CEREALS AND TUBERS',
fcs_pulses as 'PULSES',
fcs_vegetables as 'VEGETABLES',
fcs_fruit as 'FRUIT',
fcs_meat_and_fish as 'MEAT AND FISH',
fcs_milk as 'MILK',
fcs_sugar as 'SUGAR',
fcs_oil as 'OIL')))
join weights using (food_group)
group by rollup((food_group, past_7_days, weight, id)))
order by id
демо
Вы должны отменить значения для каждой группы продуктов, затем объединить их веса и умножить. Добавьте группу по свертке и условной интерпретации, используя case when
.