Postgresql split date range by business days then aggregate by month
Assuming the table has a primary (or unique) key, then you can calculate the "value per day" using this:

select to_char(dt, 'yyyy-mm') as month, 
       value, 
       value::numeric / count(*) over (partition by id) as value_per_day
from data
  left join generate_series(start, "end", interval '1 day') as t(dt) on true
where extract(dow from dt) not in (0,6) ;


generate_series() generates rows for each day between start and end, and the where clause removes the weekends. 
id is the unique identifier for the original rows it is required to be able to count the number of days "per row". With that result we can now aggregates the final result:

select month, sum(value_per_day)
from ( 
  select to_char(dt, 'yyyy-mm') as month, 
         value, 
         value::numeric / count(*) over (partition by id) as value_per_day
  from data
    left join generate_series(start, "end", interval '1 day') as t(dt) on true
  where extract(dow from dt) not in (0,6)  
) t
group by month
order by month;


Online example: https://rextester.com/KPGOFU25611