鉴于我有一个具有以下模式的表,其中
date
是非唯一的:
defmodule Record do
field(:plays, :integer)
field(:date, :date)
end
我想选择每组的播放次数总和,以及所有记录的播放次数总和:
query =
Record
|> group_by([r], [r.date])
|> select([r], %{
date: r.date,
total_plays_per_date: fragment("coalesce(sum(?), 0)", r.plays),
overall_total_plays: # Sum of all plays from all records
})
SQL 和关系数据库不容易支持这一点,而且它也不能很好地映射到 Ecto。在您显示的语法中,您尝试将每个条目的总数包含在地图记录中。执行此操作的语法会很尴尬,并且在应用程序代码中计算总和可能会更容易。
import Ecto.Query, only: [from: 2]
query = from r in Record,
group_by: r.date,
select: %{
date: r.date,
total_plays_per_date: sum(r.plays)
}
all_plays = Repo.all(query)
overall_total_plays = all_plays |> Enum.map(& &1.total_plays_per_date) |> Enum.sum()
如果您确实需要在每条记录中包含此内容,您可以在事后添加它
all_plays = Enum.map(all_plays, &Map.put(&1, :overall_total_plays, overall_total_plays))