How to collapse/group records by id within a list of maps

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