First flatten the table using jsonb_array_elements to unnest the JSON array and a lateral join in order to produce a row per array element.
SELECT
port.id as "Port ID",
port.name as "Port Name",
country.name as "Country",
port_expense.id as "Port Expense ID",
port_expense.name::text as "Port Expense",
terminal.id as "Terminal ID",
terminal.name as "Terminal Name",
berth.id as "Berth ID",
berth.name as "Berth Name",
port_expense_formula_data.name as "Data Name",
port_expense_formula_data.value as "Data Value"
j->>'from' as "From",
j->>'to' as "To",
j->>'unmoor' as "Unmoor",
j->>'var' as "Var",
j->>'tariff' as "Tariff",
j->>'rate' as "Rate",
j->>'lumpsum' as "Lumpsum",
j->>'max' as "Max",
j->>'min' as "Min",
j->>'charge' as "Charge",
j->>'day' as "Day",
j->>'night' as "Night"
from <your joined tables here>
cross join lateral
jsonb_array_elements(port_expense_formula_data.value::jsonb) j;
cross join lateral is the verbose syntax. It can be replaced by , lateral or - in the case of a set-returning function as above - just a comma.
You may simulate/experiment with this example:
with t(a, b, jdata) as
(
values
(1, 2, '[{"x":10, "y":20}, {"x":110, "y":120}]'),
(3, 4, '[{"x":11, "y":21}, {"x":111, "y":121, "z":221}]'),
(5, 6, '[{"x":12, "y":22}, {"x":112, "y":122, "z":222}]'),
(7, 8, '[{"x":13, "y":23}, {"x":113, "y":123}]')
)
select t.a, t.b,
j->>'x' as x, j->>'y' as y, j->>'z' as z
from t, jsonb_array_elements(t.jdata::jsonb) j;