You can merge with a multi clause function that will handle map keys with different merge strategies : sum for amounts, concatenation for descriptions and first value for other keys
for {id, entries} <- Enum.group_by(list, & &1.id) do
for entry <- entries, reduce: %{id: id, amount: 0, description: ""} do
acc ->
Map.merge(acc, entry, fn
:amount, amount_1, amount_2 -> amount_1 + amount_2
:description, desc_1, desc_2 -> "#{desc_1} #{desc_2}"
_key, _v1 = nil, v2 -> v2
_key, v1, _v2 -> v1
end)
end
end






















